实现 instanceof
关键字
instanceof
是用来判断 A 是否为 B 的实例, 表达式为:A instanceof B
- 如果
A
是B
的实例, 则返回true
, 否则返回false
。
- 如果
instanceof
运算符用来测试一个对象在其原型链中是否存在一个构造函数的prototype
属性。- 不能检测基本数据类型, 在原型链上的结果未必准确, 不能检测
null
,undefined
- 实现:遍历左边变量的原型链, 直到找到右边变量的
prototype
, 如果没有找到, 返回false
实现步骤
- 首先获得类型的原型
- 然后获得对象的原型
- 然后一致循环判断对象的原型是否等于类型的原型,知道对象原型为
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)
}
}