手写instanceof的实现

1,168 阅读1分钟

instanceof运算符用于检测构造函数的prototype属性是否存在于实例对象的原型链上。

function C(){} 
function D(){} 

var o = new C();

o instanceof C; // true,因为 Object.getPrototypeOf(o) === C.prototype
o instanceof D; // false,因为 D.prototype 不在 o 的原型链上

instanceof原理就是一层一层查找__proto__,如果和构造函数的prototype相等则返回true,如果一直没有查找成功则返回false

instance.[__proto__...] === instance.constructor.prototype

模拟实现instanceof

function instance_of(L, R) { // L 表示左边表达式 R表示右边表达式
    const O = R.prototype; // 取R的显式原型
    L = Object.getPrototypeOf(L); // 取L的隐式原型 L = L.__proto__
    while(true) {
    // Object.prototype.__proto__ === null
        if(L===null) {
            return false;
        }
        if(L===O) { // 当L严格等于O时,返回true
            return true;
        }
        L = Object.getPrototypeOf(L); // // 没找到继续向上一层原型链查找 L = L.__proto__
    }
}
function Foo(name) {
  this.name = name;
}
var f = new Foo('nick')

f instanceof Foo // true
f instanceof Object // true