new的实现原理:
- 创建一个空对象,构造函数中的this指向这个空对象
- 这个新对象被执行 [[原型]] 连接
- 执行构造函数方法,属性和方法被添加到this引用的对象中
- 如果构造函数中没有返回其它对象,那么返回this,即创建的这个的新对象,否则,返回构造函数中返回的对象。
function _new(){
let target = {};//创建的新对象
//第一个参数是构造函数
let [constructor,...args] = [...arguments];
//执行[[原型]]连接;target是constructor的实例
target.__proto__ = constructor.prototype;
//执行构造函数,将属性或方法添加到创建的空对象上
let result = constructor.apply(target,args);
if(result && (typeof (result) == 'object' || typeof (result) == 'function') ){
//如果构造函数执行的结构返回的是一个对象,那么返回这个对象
return result;
}
//如果构造函数返回的不是一个对象,返回创建的新对象
return target;
}
这就解释了下方这样的一个延伸面试题,问返回的是字符串'123'还是一个对象:
function Test(name,age){
this.name = name;
this.age = age;
return '123';
}
const obj = new Test('xinran001',10);
console.log(obj);//{age:10,name:'xinran001'}
只要显示return返回的不是对象类型(object、function),则返回创建的新对象。