instanceof工作原理

是什么

关于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属性,指向原型对象:
image.png
因为p是Person的实例,所以p的__proto__指向Person的原型对象,Person的prototype也是指向原型对象,所以p.proto=Person.prototype, p instanceof Person === true
image.png

再举个列子

function Person() {};
const p = new Person();
p instanceof Object   // true
复制代码

image.png

p instanceof Object
复制代码

会经历以下步骤:

  1. p._ proto_ === Object.prototype ? 返回false
  2. p._ proto._ proto === Object.prototype ? 返回true
  3. 如果还是返回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
喜欢就支持一下吧
点赞0 分享