首先要知道instanceof是用来判断构造函数的prototype属性是否出现在原型链上的任何位置。(沿着原型链向上查找)
也就是说A instanceof B判断B的prototype属性指向的原型对象(B.prototype)是否在对象A的原型链上。
如果A的原型链经过B的原型对象(B.prototype),那么A instanceof B就会判断为true。
所以构造函数的prototype属性指向它的原型对象,构造函数的实例的_proto_属性也指向该原型对象。而且每个对象都有_proto_属性,只有Object.prototype.__proto__ === null。
例如我们创建一个Person的实例p1,p1=new Person(),判断p1 instanceof Person和p1 instanceof Object是否为true。

从上图就可以知道Person的原型对象出现在p1的原型链上,Object的原型对象也出现在p1的原型链上。
所以我们用代码就可以实现instanceof:
function myInstanceof(left,right){
//获取构造函数的原型对象
let prototype=right.prototype;
//获取对象的原型,也可以使用Object.getPrototypeOf(left)得到该对象的原型
let leftProto=left.__proto__;
while(true){
//查找到最顶端也没有就返回false
if(leftProto===null) return false;
if(leftProto===prototype)return true;
//沿着原型链向上查找
leftProto=leftProto.__proto__;
}
}
本文解析了JavaScript中instanceof操作符的工作原理,通过实例说明了如何判断一个对象是否属于某个构造函数的原型链。并提供了一个自定义实现instanceof的方法。

856

被折叠的 条评论
为什么被折叠?



