instanceof 模拟实现

60 阅读1分钟

instanceof

前置知识

  1. 每个函数都有prototype属性,指向其原型;
  2. 每个对象都有隐式属性[[prototype]]指向该对象的原型, 但该属性为内部属性,无法直接访问,所以通过__proto__属性访问;

作用

用来检测 constructor.prototype 是否存在于参数 object 的原型链上。

语法

object instanceof constructor

参数:

  1. object: 某个实例对象;
  2. constructor: 某个构造函数;

模拟实现

实现步骤:

  1. 接收目标对象和目标构造函数
  2. 递归原型链上查找目标构造函数的原型
  3. 若目标对象原型链上找到目标构造函数的原型,返回true;若找到原型链的终端(null)依旧未找到,则返回false;
function instanceOf(obj, target) {
    let prototype = obj.__proto__

    while(true) {
      if(!prototype) return false

      if(prototype === target.prototype) return true

      prototype = prototype.__proto__
    }
  }