手写new

115 阅读1分钟

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;
}