[JavaScript模拟实现]instanceof操作符

292 阅读1分钟

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

参考:

浅谈 instanceof 和 typeof 的实现原理

面不面试的,你都得懂原型和原型链

图解原型链及其继承优缺点

手动实现instanceof.md