首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

为什么我不能在JavaScript "isPrototypeOf“中使用对象的原型?

在JavaScript中,"isPrototypeOf"是一个用于检查对象是否存在于另一个对象的原型链中的方法。它用于确定一个对象是否是另一个对象的原型。

然而,"isPrototypeOf"方法只能用于检查对象是否是另一个对象的原型,而不能直接用于检查对象的原型链中的原型。这是因为JavaScript中的原型链是一个单向链,只能从子对象向父对象进行访问,而不能反过来。

具体来说,当我们使用"isPrototypeOf"方法时,它会检查调用该方法的对象是否存在于指定对象的原型链中。如果存在,则返回true,否则返回false。但是,它不能直接访问对象的原型链中的其他原型。

为了更好地理解这个问题,让我们来看一个例子:

代码语言:javascript
复制
function Person() {}
function Student() {}

Student.prototype = Object.create(Person.prototype);

var john = new Student();

console.log(Person.prototype.isPrototypeOf(john)); // true
console.log(Student.prototype.isPrototypeOf(john)); // true
console.log(Object.prototype.isPrototypeOf(john)); // true

console.log(john.isPrototypeOf(Person.prototype)); // false
console.log(john.isPrototypeOf(Student.prototype)); // false

在上面的例子中,我们创建了一个Person构造函数和一个Student构造函数。然后,我们将Student的原型设置为Person的实例,以便Student可以继承Person的属性和方法。

在这个例子中,我们可以使用"Person.prototype.isPrototypeOf(john)"来检查Person是否是john的原型,这将返回true。同样,我们可以使用"Student.prototype.isPrototypeOf(john)"来检查Student是否是john的原型,这也将返回true。甚至我们可以使用"Object.prototype.isPrototypeOf(john)"来检查Object是否是john的原型,这同样也将返回true。

然而,如果我们尝试使用"john.isPrototypeOf(Person.prototype)"来检查john是否是Person的原型,这将返回false。同样,如果我们尝试使用"john.isPrototypeOf(Student.prototype)"来检查john是否是Student的原型,也将返回false。

这是因为原型链是单向的,我们只能从子对象向父对象进行访问,而不能反过来。因此,在"isPrototypeOf"方法中,我们不能直接使用对象的原型。

总结起来,"isPrototypeOf"方法用于检查对象是否存在于另一个对象的原型链中,但不能直接用于检查对象的原型链中的原型。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

深度剖析前端JavaScript原型(JS对象原型)

这张图片有点劝退了,哈哈哈~ 通过原型机制,JavaScript 对象从其他对象继承功能特性;这种继承机制与经典面向对象编程语言继承机制不同。...注意:没有官方方法用于直接访问一个对象原型对象——原型“连接”被定义在一个内部属性,在 JavaScript 语言标准中用 [[prototype]] 表示(参见 ECMAScript)。...这些方法/属性仅能被 Object() 构造器自身使用。 注意:这看起来很奇怪——构造器本身就是函数,你怎么可能在构造器这个函数定义一个方法呢?其实函数也是一个对象类型。...JavaScript 到处都是通过原型链继承例子。比如,你可以尝试从 String、Date、Number 和 Array 全局对象原型寻找方法和属性。...你可能会认为,this 关键字指向当前对象原型对象,其实不是(还记得么?原型对象是一个内部对象,应当使用 __proto__ 访问)。

1.1K30

深入理解javascript原型原型概念使用原型对象添加方法和属性使用原型对象属性和方法原型陷阱小结

---- 使用原型对象添加方法和属性 不使用原型使用构造函数给对象添加属性和方法是通过this,像下面这样。...其实很好理解,javascript对象是通过引用传递原型对象只有一份,不是new出一个对象就复制一份,所以我们对原型操作和更新,会影响到所有的对象。这就是原型对象实时性。 ?...isPrototypeOf() Object原型里还有这样一个方法isPrototypeOf(),这个方法可以返回一个特定对象是不是另一个对象原型,实际这里不准确,因为我们知道只有函数对象原型属性...这就是javascript原型陷阱。 我们很容易解决这个问题,只要在更新原型对象后面,重新指定构造函数即可。 Dog.prototype.constructor = Dog; ?...对象自身属性搜索优先级比原型属性要高 proto属性神秘连接及其同prototype区别 prototype使用陷阱

4.3K30
  • 【说站】Javascript对象原型 __proto__介绍

    Javascript对象原型 __proto__介绍 说明 1、所有对象都会有一个属性__proto__指向构造函数prototype原型对象....之所以我们可以使用构造函数prototype原型对象属性和方法,是因为对象有__proto__原型。 2、__proto__对象原型意义在于为对象搜索机制提供一个方向或一条路线....但它是一个非标准属性,所以在实际开发不能使用这个属性,它只是指原型对象prototype。... __proto__ 指向我们构造函数原型对象 prototype         console.log(ldh..../ 如果么有sing 这个方法,因为有__proto__ 存在,就去构造函数原型对象prototype身上去查找sing这个方法      以上就是Javascript对象原型 _

    48310

    为什么建议使用框架默认 DefaultMeterObservationHandler

    为什么建议使用框架默认 DefaultMeterObservationHandler 背景知识 最近,我们升级了 SpringBoot 3.x,并且,升级后,我们全面改造了原来 Sleuth 以及...全面使用 Observation 遇到了内存溢出以及 CPU 飙高(非不断 GC 导致) 但是,我们在全面使用 Observation 时候,发现了一个问题,就是内存溢出以及 CPU 飙高(非不断 GC... activeTasks ,这是一个 ConcurrentLinkedDeque。...start 时候,创建一个 LongTaskTimer.Sample 对象,然后将这个 LongTaskTimer.Sample 对象放入 LongTaskTimer activeTasks ,...然后还有一个 Timer.Sample 对象,这个 Timer.Sample 对象是用于记录 Observation 耗时

    9900

    【前端词典】继承

    JavaScript 摒弃类转而使用原型作为实现继承基础,是因为基于原型继承相比基于类继承上在概念上更为简单。...这些方法都以事先内置在 JavaScript ,直接调用即可。上面标红了两个特别的属性 constructor 和 __proto__。这两个属性接下来都会讲。...先给个有点绕定义: __proto__ 指向了创建该对象构造函数显式原型。 我们现在还是使用 noWork 这个例子来说。...听到有人在问为什么? 因为这个 __proto__.constructor 指向是 Object。 我们知道:一个函数原型对象构造函数是这个函数本身。...看到一个解释是这样: 其他所有的构造函数都可以通过原型链找到 Function.prototype ,并且 functionFunction() 本质也是一个函数,为了产生混乱就将 functionFunction

    60070

    JavaScript之面向对象学习六原型模式创建对象问题,组合使用构造函数模式和原型模式创建对象

    一、仔细分析前面的原型模式创建对象方法,发现原型模式创建对象,也存在一些问题,如下: 1、它省略了为构造函数传递初始化参数这个环节,结果所有实例在默认情况下都将取得相同属性值,这还不是最大问题!...2、最大问题是原型所有属性是被很多实例所共享,这种共享对于函数非常合适,对于那些包含基本值属性也说得过去,因为我们知道可以在实例上添加一个同名属性,可以隐藏原型对应属性。...,发现person2同时也被添加了一个朋友,但这并不是我们想要,而这正是因为原型模式共享本性所导致,只要任何一个实例修改了原型属性对象属性值,所有与该原型对象关联实例都会受到影响!...二、组合使用构造函数模式和原型模式 为了解决原型模式不能初始化参数和共享对于引用模式所存在问题!...1、构造函数:构造函数创建类型相同函数,确是不同作用域链和标识符解析(因为在JS每创建一个函数就是一个对象,所以  (导致了构造函数方法)  在不同实例中都需要重新创建一遍,但是这些方法做的确实同一件事情

    1.4K60

    JavaScriptisPrototypeOf函数详解

    JavaScriptisPrototypeOf函数详解 有时看一些框架源码时候,会碰到 isPrototypeOf() 这个函数,那么这个函数有什么作用呢?...这个函数理解关键是在原型链上,这个据说是JavaScript三座大山之一。 这里不详述其中原理,简单来讲就是3点: 1. 函数对象,都会天生自带一个prototype原型属性。 2....复制代码 为什么呢?...示例4,Object.prototype是否是内置类原型JavaScript内置类Number、String、Boolean、Function、Array因为都是继承Object,所以下面的输出也都是...(function(){} instanceof Function); 复制代码 instanceof 作用原理就是判断实例原型能否找到类原型对象(prototype),而 isPrototypeOf

    54040

    JavaScript原型继承在使用存在安全问题

    JavaScript原型很多人都知道也很好用,但是很多人在使用原型继承中导致安全问题却很少人知道,接下来我们就来好好了解一下。...在真实开发,我们经常会在代码中使用Property accessors 属性访问器,并且使用用户输入参数去访问某个对象属性。...这看起来可能是一个很稀疏平常操作,但是往往在这个过程我们代码就已经产生了一个很大安全漏洞!!!为什么这样写代码会产生安全问题?...假设黑客知道你代码在运行时会创建一个新对象,并且你没有使用Object.create(null)创建一个没有原型对象。...在代码减少属性访问器使用尽可能使用.方式去访问对象属性或者使用 Map或Set,来代替我们对象检查对象原型链,查看新创建对象原型是否被恶意添加了原本不该有的属性,或者属性被修改检查用户输入

    18811

    前端入门13-JavaScript进阶之原型声明正文-原型

    这也是为什么会在对象一节说,所有通过直接量方式创建对象都继承自 Object.prototype 理由。...所以,在 JavaScript ,绝大部分对象都有原型,即使手动指定,也会有默认内置原型对象。...但它跟 instanceof 有个本质上区别,instanceof 是运算符,而 isPrototypeOf 是 Object.prototype 方法,由于基本所有对象都继承自这个,所以基本所有对象都可以使用这个方法...instanceof 和 isPrototypeOf 更多使用场景是用于判断语句中,如果需要主动对某个对象获取它一些标识,可以使用接下来介绍几种方式: typeof 在 JavaScript 数据类型大体上分两类...所以,在 JavaScript 有一种编程理念:鸭式辩型 鸭式辩型 不是很理解中文翻译为什么是这个词,应该是某个英文词直译过来。 它理念是:像鸭子一样走路、游泳、嘎嘎叫鸟就称它为鸭子。

    63330

    一文带你彻底搞懂JavaScript原型

    是因为它借鉴了C语言基本语法和Self语言使用基于原型(prototype)继承机制。 所以我们也经常可以看到JavaScript被描述为一种基于原型语言,每个对象都有一个原型对象。...1 函数和对象 首先我们先来看一下JavaScript函数和对象关系,这对我们理解原型链有很大帮助。 你可能也会看到“JavaScript万物皆对象”,这显然是错误。...实际上在JavaScript,有许多特殊对象子类型,可以叫做复杂基本类型。 函数就是对象一个子类型。 函数本质就是对象。 但是为什么使用typeof进行类型检查时候会有下面的结果呢?...在JavaScript,检测对象类型时,强烈建议使用Object.prototype.toString方法。typeof一些返回值在标准文档并未定义,因此不同引擎实现可能不同。...__proto__)); // true isPrototypeOf方法用于检查某对象是否在指定对象原型

    35821

    充分了解JavaScript对象,顺便弄懂你一直不明白原型原型

    JavaScript——对象 引言 正文 一、对象定义 二、对象创建 三、对象原型以及原型链 四、对象属性 (1)属性查询与设置 (2)属性删除 (3)属性检测 (4)特殊属性 (5...)属性特性 五、对象特性 (1)对象原型 (2)对象类 (3)对象扩展 结束语 引言 相信很多小伙伴学习了javascript,但是对于对象只是有一个初步认识,并且对于对象原型原型链之类概念还没有很好认识吧...所以在实际应用,如果遇到此类情况,尽量避免使用对象直接量方式创建对象。...在JavaScript,绝大部分对象都有一个共同原型,他就是 Object.prototype ,也就是说 Object.prototype 是最原始那家餐饮店,而非加盟店。...(obj) //返回 {x:1} isPrototypeOf( ) 该方法可以判断一个对象是否是另一个对象原型,或者说在另一个对象原型链上。

    29610

    判断是否为数组 JavaScript 方法总结

    function () { } console.log(arr.constructor === Array); // false 一般推荐使用 constructor 来判断是否为数组,我们只需要知道有这么一个方法就行...instanceof instanceof 运算符用于检测构造函数 prototype 属性是否出现在某个实例对象原型链上。...isPrototypeOf isPrototypeOf() 可以用于测试一个对象是否存在于另一个对象原型链上。...默认情况下,toString() 方法被每个 Object 对象继承。如果此方法在自定义对象未被覆盖,toString() 返回 "object type" 字符串,其中 type 是对象类型。...~ 学习有趣知识,结识有趣朋友,塑造有趣灵魂! 大家好,是〖编程三昧〗作者 隐逸王,公众号是『编程三昧』,欢迎关注,希望大家多多指教! 你来,怀揣期望,有墨香相迎!

    1.1K10

    深入理解javascript继承机制(3)属性复制对象之间继承深复制原型继承原型继承与属性复制混合使用

    属性复制 下面我们就实现这样一种继承方式,将父亲原型对象属性全部复制到子对象原型属性 function extend2(Child, Parent) { var p = Parent.prototype...对象之间继承 extend2,我们都是以构造器创建对象为基础,我们将原型对象属性一一拷贝给子原型对象,而这两个原型本质上也是对象。现在我们考虑不通过原型,直接在对象之间拷贝属性。...原型继承与属性复制混合使用 我们知道实现继承就是将已有的功能归为所有,我们在new一个新对象时候,应该继承于现有对象,然后再为其添加额外属性与方法。...原型继承可以在新建一个对象时候,将已有对象设置为新对象原型。 属性拷贝,就是在新建一个对象之后,将另一个已有对象属性拷贝过来。 我们将这两项功能放在一个函数。...,一个用于原型继承,一个用于属性拷贝,这里使用是浅拷贝,也可以改成深拷贝。

    1.5K20

    JavaScript 判断空对象、空数组方法

    一、为什么判定空对象、空数据有点“难”? 首先,我们先看下下面的表格: a 取非 !a 和自己比较 a===null/undefined......var obj = []; Array.prototype.isPrototypeOf(obj); // true isPrototypeOf() 方法用于测试一个对象是否存在于另一个对象原型链上。...(obj) && Object.keys(obj).length === 0 其中,Object.keys()方法会返回一个由给定对象自身可枚举属性组成数组,数组属性名排列顺序和使用 for.....中一切皆是对象,也就是说,Object 也存在于数组原型链上,因此在封装校验方法时,数组需要先于对象检验。...在表达式 obj instanceof AFunction ,检测是 AFunction.prototype 是否在obj 原型,而不是检测 AFunction 自身。

    29.3K43

    JavaScript 对象所有API解析【2020版】

    刚好看到《JavaScript 面向对象编程指南(第 2 版)》,觉得有必要写(或者说 chao)一下,也好熟悉下对象所有 API 用法。...此外,也不要忘了浏览器向后兼容ES3方面所做考虑。例如,跟添加Array.prototype属性不一样,我们不能在旧版浏览器中使用shim这一特性。...我们往往需要通过Object.prototype.isPrototypeOf()去猜测某个给定对象原型是什么,如今在ES5,我们可以直接询问改对象“你原型是什么?”...返回一个给定对象自己所有可枚举属性值数组,值顺序与使用for...in循环顺序相同 ( 区别在于for-in循环枚举原型属性 )。...[key,value]对数组,数组中键值对排列顺序和使用 for...in 循环遍历该对象时返回顺序一致(区别在于一个for-in循环也枚举原型属性)。

    1K20

    每天10个前端小知识 【Day 4】

    使用Object原型方法isPrototypeOf,判断两个对象原型是否一样, isPrototypeOf() 方法用于测试一个对象是否存在于另一个对象原型链上。...Object.getPrototypeOf() 方法返回指定对象原型(内部[[Prototype]]属性值)。...为什么JavaScript是单线程? JavaScript单线程,与它用途有关。作为浏览器脚本语言,JavaScript主要用途是与用户互动,以及操作DOM。...当用户最终离开时,window 上 unload 事件就会被触发。在处理程序,我们只能执行涉及延迟或询问用户简单操作。正是由于这个限制,它很少被使用。...Null是对象吗?为什么? null不是对象。 虽然 typeof null 会输出 object,但是这只是 JS 存在一个悠久 Bug。

    12210

    JavaScript原型原型

    实际上,这个prototype对象就是通过调用构造函数创建对象原型使用原型对象好处是,在它上面定义属性和方法可以被所有实例对象共享。...JavaScript没有访问这个[[prototype]]特性标准方式,但Firefox、Safari、Chrome会在每个对象上暴露_proto_属性,通过这个属性可以访问对象原型。...虽然不是所有实现都对外暴露了[[prototype]],但是可以使用isPrototypeOf()方法,确定两个对象是否共享一个原型(其实这个原型就是一个隐藏类,对隐藏类不了解可以看一下另一篇文章...:垃圾回收与内存管理 4.3节),本质上,isPrototypeOf()会在传入参数[[prototype]]指向调用它对象时,返回true,即: Persion.prototype.isPrototypeOf...(person,biped); console.log(person.biped);// 2,通过Object.setPrototypeOf为person原型对象写入了新值 但是推荐这样做,因为修改了原型会间接修改了继承关系

    35520

    typeof和instanceof原理

    一个恰当例子,假设所有的Javascript对象都是16位,也就是有16个0或1组成序列,猜想如下: Array: 1000100010001000 null: 0000000000000000...那么 prototype 就是调用 构造函数 而创建那个对象实例原型对象使用原型对象好处是可以让所有对象实例共享它所包含属性和方法。...显然,此时原型对象将包含一个指向另一个原型指针,相应地,另一个原型也包含着一个指向指向另一个构造函数指针。...__proto__ ...来遍历)原型链的话,这个方法非常有用。 和.construtor一样,__proto__实际上并不存在于你正在使用对象(本例是a)。...原型链这部分很不好理解,基本上都是看完过几天就忘,所以要多看几遍多理解,花些时间搞明白,搞明白这部分。之后再看相关东西,就很简单易懂。这部分是JavaScript很重要核心。

    2.5K41

    重学JavaScript之面向对象程序设计(继承)

    1、来自包含引用类型值原型。在之前说过包含引用类型值原型属性会被所有实例共享。所以这也是为什么要在构造函数,而不是在原型对象定义属性原因。...另外,在超类型原型定义方法,对子类型而言也是不可见。结果所有类型都只能使用构造 函数模式。所以借用构造函数模式很少单独使用。 8....由于函数可以局限于任何对象。因此没有理由不再多个对象之间共享函数。 11.3 原型模式 使用构造函数 prototype 属性来指定那些应该共享属性和方法。...11.4 原型式继承 可以在预先定义构造函数情况下实现继承,其本质是执行对给定对象浅复制。...8、重学js之JavaScript面向对象程序设计(创建对象

    34620
    领券