手写 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
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。