instanceof 运算符用于检测构造函数的 prototype 属性是否出现在某个实例对象的原型链上。
instanceof 原理就是一层一层查找 __proto__,如果和 constructor.prototype 相等则返回 true,如果一直没有查找成功则返回 false。
instance.[__proto__...] === constructor.prototype
模拟代码如下:
function myInstanceof(L, R) {
let O = R.prototype // 取 R 的显式原型
L = L.__proto__ // 取 L 的隐式原型
while (true) {
// Object.prototype.__proto__ === null
if (L === null) {
return false
}
if (O === L) {
return true
}
L = L.__proto__
}
}
function Foo(){}
console.log(Foo instanceof Foo) // false
console.log(myInstanceof(Foo,Foo)) // false
console.log(Object instanceof Object) // true
console.log(myInstanceof(Object,Object)) // true
console.log(Function instanceof Function) // true
console.log(myInstanceof(Function,Function)) // true
console.log(Foo instanceof Function) // true
console.log(myInstanceof(Foo,Function)) // true
console.log(Foo instanceof Object) // true
console.log(myInstanceof(Foo,Object)) // true