Skip to content
大纲

实现 instanceof 关键字

  • instanceof 是用来判断 A 是否为 B 的实例, 表达式为:A instanceof B
    • 如果 AB 的实例, 则返回 true, 否则返回 false
  • instanceof 运算符用来测试一个对象在其原型链中是否存在一个构造函数的 prototype 属性。
  • 不能检测基本数据类型, 在原型链上的结果未必准确, 不能检测 null, undefined
  • 实现:遍历左边变量的原型链, 直到找到右边变量的 prototype, 如果没有找到, 返回 false

实现步骤

  1. 首先获得类型的原型
  2. 然后获得对象的原型
  3. 然后一致循环判断对象的原型是否等于类型的原型,知道对象原型为 null,因为原型链最终为 null
点我查看详细
js
// 实现 `instanceof` 关键字

// instanceof 运算符用于判断构造函数的 prototype 属性是否出现在对象的原型链中的任何位置。
// __proto__ 已废弃, 建议使用 Object.getPrototypeOf() (其兼容性已非常好)
function myInstanceof2(left, right) {
  // let left = a.__proto__;
  let proto = Object.getPrototypeOf(left) // 获取对象的原型
  let prototype = right.prototype // 获取构造函数的 prototype 对象

  // 判断构造函数的 prototype 对象是否在对象的原型链上
  while (true) {
    if (!proto) return false
    if (proto === prototype) return true

    proto = Object.getPrototypeOf(proto)
  }
}