佳宸学习和分享笔记的地方

0%

new 和 instanceof

new 和 instanceof

new模拟实现

1
2
3
4
5
6
7
8
9
10
11
function myNew() {
// 创建一个空对象
let obj = {}
// 取第一个参数构造函数
let Con = [].shift.call(arguments)
// 把把新对象的原型链 链到 构造函数的原型对象
obj.__proto__ = Con.prototype
// 绑定this 实现继承 , obj可以访问到构造函数的属性
Con.apply(obj, arguments)
return obj
}

instanceof

instanceof 可以正确的判断对象的类型,因为内部机制是通过判断对象的原型链中是不是能找到类型的 prototype

1
2
3
4
5
6
7
8
9
10
11
12
13
function myInstanceof(left, right) {
left = left.__proto__
while (true) {
// 到链的顶端 null 还没找到,就说明没有继承关系
if (left === null || left === undefined)
return false
// 右边的原型对象 等于左边的_PROTO_ 就说明是继承关系
if (right.prototype === left)
return true
// 原型链深入
left = left.__proto__
}
}