new操作符做了什么?
1.创建一个空对象,将其做为this;
2.空对象继承了函数的原型,空对象的proto指向函数的prototype;
3.执行该函数,fn.call(obj);
4.判断构造函数返回值:为空返回基本类型obj;为object就返回引用类型res;特殊情况,为null返回obj

实现一个new:

function New(fn) {
  let obj = {};
  obj.__proto__ = fn.prototype
  let res = fn.call(obj)
  return typeof res === 'object' ? res || obj : obj
}