手写 Instanceof 和 new

手写 instanceof
instanceof 检查目标对象的原型链中是否有与指定对象的原型相同的原型,
通过 === 严格等于来对于两个原型是否相等。
function myInstanceof(obj, obj2) {
    let proto = obj.__proto__;
    let prototype = obj2.prototype;
    let queue = [proto];
    // 循环 obj 原型链进行获取 __proto__ 与 prototype 对比
    while(queue.length) {
        let temp = queue.shift();
        if(temp === null) return false;
        if(temp === prototype) return true;
        queue.push(temp.__proto__);
    }
}

// 测试

myInstanceof(new Date(), Date);         // true
myInstanceof({}, Object);               // true
myInstanceof('Jason', Number);          // false
myInstanceof(23, Stirng);               // false
手写 new
思路:
    1. new F() 通过构造函数创建的对象的 __proto__ 指向构造函数的原型.
    2. F() 构造函数中的 this 指向 F()构造函数的实例对象.
function myNew(F){
    let result = {};
    let arg = Array.prototype.slice.call(arguments, 1);
    // 将实例对象的 __proto__ 指向 F.prototype
    Object.setPrototypeOf(result, F.prototype);
    // this 指向实例对象
    F.apply(result, arg);
   return result;
}

// 测试
function F(name, age) {
    this.name = name;
    this.age = age;
}

let user = myNew(F, "Jason", 23);
console.log(user.__proto__ === F.prototype);            // true
阅读 76

推荐阅读