instanceof原理

68 阅读1分钟

instanceof用于判断一个对象是否为另一个对象的实例

let Person = function () {};
let p = new Person();
console.log(p instanceof Person); // true

它不能对非对象类型进行判断,也就是说不能通过它对非引用类型值进行判断是否为某个对象的实例

let num = 1;
console.log(num instanceof Number); // false

instanceof是通过关键字前面的对象的__proto__隐式原型链一层一层的向上寻找查看是否有与之相等的构造函数的prototype对象。既然知道了他的原理那让我们来实现一个_instanceof函数

function _instanceof(A, B) {
  let Bproto = B.prototype; // 取出B的原型
  let Aproto = A.__proto__; // 取出A的隐式原型

  while (true) {
    if (Aproto === null) {
      return false; // 如果A的隐式原型链上没有找到B的原型,则返回false
    }
    if (Aproto === Bproto) {
      return true; // 如果A的隐式原型链上找到了B的原型,则返回true
    }
    Aproto = Aproto.__proto__; // 继续向上寻找
  }
};

接下来让我们使用上面的_instanceof函数来判断一下是否满足预期

let a = new String("1");
let b = 1;
console.log(_instanceof(a, String)); //true
console.log(_instanceof(b, Number)); // true
let Person = function () {};
let p = new Person();
console.log(_instanceof(p, Person)); // true

通过上述结果可以看出_instanceof不仅可以对对象进行判断是否A(代称左边对象)的隐式原型链上有B(代称右边对象)的原型。而且可以对非引用类型进行判断。可以得出instanceof对判断的范围进行了限制只要是非引用类型值直接返回false。

第一次写文章如有出错之处,请海涵。