Loading... **手写 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 ``` Last modification:August 1, 2021 © Allow specification reprint Support Appreciate the author Like 0 欢迎留下您的脚印