instanceof 操作符的实现原理及实现

74 阅读1分钟

概念: instanceof 运算符用于判断构造函数的 prototype 属性是否出现在对象的原型链中的任何位置

详细来说:instanceof 运算符的原理是通过检查object的原型链是否包含constructor的原型对象。如果object的原型链中存在constructor的原型对象,那么object就是constructor的一个实例,返回值为true。如果object的原型链中不存在constructor的原型对象,那么object就不是constructor的实例,返回值为flase

缺点:由于 instanceof 是基于原型链的检查,因此如果某个对象的原型链比较深,那么检查的效率比较低

具体手写实现:

function myInstanceof(left, right) {
  // 获取对象的原型
  let proto = Object.getPrototypeOf(left)
  // 获取构造函数的 prototype 对象
  let prototype = right.prototype; 
 
  // 判断构造函数的 prototype 对象是否在对象的原型链上
  while (true) {
    if (!proto) return false;
    if (proto === prototype) return true;
    // 如果没有找到,就继续从其原型上找,Object.getPrototypeOf方法用来获取指定对象的原型
    proto = Object.getPrototypeOf(proto);
  }
}