instanceof 检查对象原型链是否包含构造函数的 prototype 对象,基于引用相等向上查找 [[Prototype]],不依赖 constructor 属性;原始值返回 false,null 无原型链,undefined 右侧非函数则报错;可由 Symbol.hasInstance 自定义行为。

instanceof 检查的是对象的原型链上是否包含构造函数的 prototype 对象。
它不检查构造函数本身,也不检查对象的 constructor 属性
很多人误以为 instanceof 是看 obj.constructor === Ctor,其实不是。constructor 可以被随意修改,完全不可靠。instanceof 的判断依据只有一条:沿着 obj 的 __proto__(即内部 [[Prototype]])一路向上查找,看能不能找到 Ctor.prototype 这个对象。
- 如果找到了,返回
true - 如果查到原型链尽头(null)都没找到,返回
false - 要求右边必须是函数(否则抛错),左边可以是任意值(非对象会直接返回 false)
原型链查找是基于引用相等,不是值相等
instanceof 不关心 Ctor.prototype 上有什么属性或方法,只关心“是不是同一个对象”。哪怕两个函数有完全一样的 prototype 内容,只要不是同一个对象实例,就不会匹配。
例如:
标签: javascript es6 java
版权声明:除非特别标注,否则均为本站原创文章,转载时请以链接形式注明文章出处。
还木有评论哦,快来抢沙发吧~