new操作符做了什么事情:
1.创建一个空对象 将来会返回这个对象
2.调用构造函数,并将构造函数的this指向新创建的对象obj
3.把原型对象的方法给新创建的obj,把obj的__proto__指向构造函数的显式原型
4.判断构造函数的返回值,来决定new的返回值(是构造函数的返回值还是实例化对象)
function myNew(fn, ...args) {
// 基于原型链 创建一个新对象
let newObj = Object.create(fn.prototype)
// 添加属性到新对象上 并获取obj函数的结果
let res = fn.call(newObj, ...args)
// 如果执行结果有返回值并且是一个对象, 返回执行的结果, 否则, 返回新创建的对象
return res && typeof res === 'object' ? res : newObj;
}