是什么
关于instanceof,mdn上这样解释:
instanceof
运算符用于检测构造函数的prototype
属性是否出现在某个实例对象的原型链上。
A instanceof B 这里有两个点需要注意:
- A必须是个对象
- B必须是个合法的函数(构造函数)
然后再判断A的__proto__是否等于B的prototype;
工作原理
因为B的prototype是指向原型对象,A实例的__proto__也是指向该实例构造函数的原型对象,如果B的prototype上找不到,就从A的原型对象的__proto__上继续找,找到了就返回true,一直找到A原型链顶部还找不到就返回false;
A.__ proto__ === B.prototype;
// 如果返回false
A.__proto__.__proto__ === B.prototype
...
// 一直找直到返回true或者找到最顶层返回false
A.__proto__.proto__.proto_... __proto__= B.prototype
复制代码
举个例子
function Person() {};
const p = new Person();
p instanceof Person // true
复制代码
我们都知道Person构造函数上存在prototype属性,指向原型对象:
因为p是Person的实例,所以p的__proto__指向Person的原型对象,Person的prototype也是指向原型对象,所以p.proto=Person.prototype, p instanceof Person === true
再举个列子
function Person() {};
const p = new Person();
p instanceof Object // true
复制代码
p instanceof Object
复制代码
会经历以下步骤:
- p._ proto_ === Object.prototype ? 返回false
- p._ proto._ proto === Object.prototype ? 返回true
- 如果还是返回false,那么p._ proto._ proto ….. _ proto _ === Object.prototype
如何实现一个instanceof
经过上面的分析得出通过上面的例子我们可以知道,其实 instanceof
的原理非常简单,就是一个查找原型链的过程,所以只要你理解了原型链的相关知识,理解 instanceof
的原理就不会再有问题了。那么如何实现一个instanceof呢?
function instance_of(left, right) {
const RP = right.prototype; // 构造函数的原型
while(true) {
if (left === null) {
return false;
}
if (left === RP) { // 一定要严格比较
return true;
}
left = left.__proto__; // 沿着原型链重新赋值
}
}
复制代码
以上就是关于instanceof的理解,如有问题,欢迎指出~
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END