我估计很多人都会说:new操作符具体做了
- 创建一个对象
- 原型赋值
- 改变this指向
- 返回对象
其实是不全的,不全就在最后一步。
下面我们就一一论证:
function Fun(){
console.log( 1 );
return 111;
}
let o1 = new Fun();
以上代码返回结果是什么?1. 运行函数体代码 2. 返回一个对象
那么如果这样写呢?
function Fun(){
console.log( 1 );
return [1,2,3];
}
let o2 = new Fun();
运行以上代码发现了,居然是1. 运行函数体代码 2. 返回了return的数组。
所以new操作符的最后一步其实要判断的,大致封装代码如下:
function Fun(Con, ...args){
// 1. 创建一个空的对象
let obj = Object.create(null);
// 2. 将空对象指向构造函数的原型链
Object.setPrototypeOf(obj, Con.prototype);
// 3. obj绑定到构造函数上,便可以访问构造函数中的属性,即obj.Con(args)
let result = Con.apply(obj, args);
// 4.1 如果返回的result是一个对象则返回
// 4.2 new方法失效,否则返回obj
return result instanceof Object ? result : obj;
}
了解更多,请来小鹿线:https://xuexiluxian.cn/