前端开发那些事儿

模拟实现 instanceof 效果

2021-03-18  本文已影响0人  弱冠而不立

instanceof 运算符的定义

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

因为原型链是层层递进的,所以我们可能需要进行迭代地访问实例对象的原型链

具体实现:

/**
 * 模拟实现 instanceof 
 * instanceof: 检测构造函数的 prototype 属性是否出现在某个实例对象的原型链上。
 * @param {object} obj 实例对象
 * @param {function} cst 构造函数
 */
function foo(obj, cst) {

    // 如果传入的实例不是对象,则直接返回 false
    if(typeof obj !== "object") {
        return false;
    }

    // 获取构造函数上原型
    const cstPrototpe = cst.prototype;
    // __proto__ 已经是不标准的获取对象原型的方法,遵守最新ES的规范还是使用 getPrototypeO
    let objProto = Object.getPrototypeOf(obj);

    while(true) {
        // 死循环的出口
        //因为原型链顶端是 null, 如果到这了还在循环,则证明构造函数的原型并没有出现在实例的原型链上
        if(objProto === null) {
            return false;
        }

        // 如果原型链上存在该构造函数的原型,则返回 true
        if(objProto === cstPrototpe) {
            return true;
        // 否则,进入原型链的下一层
        } else {
            objProto = Object.getPrototypeOf(objProto);
        }
    }
}

// 使用一下
console.log("" instanceof String);
console.log(foo("", String));

console.log({} instanceof Object);
console.log(foo({}, Object));

function Person(name) {
    this.name = name;
}
const p1 = new Person("kiana");
console.log(p1 instanceof Person);
console.log(foo(p1, Person));

console.log({name: "hutao"} instanceof Person);
console.log(foo({name: "hutao"}, Person));
上一篇下一篇

猜你喜欢

热点阅读