new 功能分析
看看new 运算符都干了什么
1. 创建一个空对象obj
2. 将空对象原型链上的__proto__ 指向 构造函数的原型ptototype
3. 绑定this值,将构造函数this指向空对象,并传入参数
4. 如果构造函数Fn返回值是一个对象或函数,则返回改对象,否则返回obj
function Parent (name,age) {
this.name = name;
this.age = age;
}
let p1 = new Parent('zs', 33);
console.log(p1);
原理实现
function New(fn, ...args) {
let obj = {}; // 1. 创建空对象
obj.__proto__ = fn.prototype; // 2.空对象__proto__指构造函数ptototype
let result = fn.apply(obj, args); // 3. 绑定this指向空对象,传参
// 4.如果构造函数fn返回值是对象或函数,使用此返回值
if (result && (typeof(result) === 'object' || typeof(result) === 'function')) {
return result
}
return obj // 否则返回obj
}
调用函数
let p2 = New(Parent, 'ls', 44)
console.log(p2);
instanceof 功能分析
1. 满足 typeof 功能类型的不足,对于复杂数据类型,除了函数都返回object
typeof([1,2]) // "object"
typeof({}) // "object"
2. instanceof 内部机制是通过原型链来实现的。因此传入类型需是object类型
1 instanceof Number // false
new Number(1) instanceof Number // true
原理实现
function instance_of (L, R) { // L为实例(instanceof左边),R为构造函数(instanceof右边)
let R = R.prototype; // 构造函数显式原型
L = L.__proto__; // 实例隐式原型
while (true) {
if (L === null) return false;
if (R == L) return true;
L = L.__proto__; // 获取父级的__proto__
}
}