# 模拟new操作符
new关键字
- 创建一个空的简单JavaScript对象(即{});
 - 链接该对象(即设置该对象的构造函数)到另一个对象 ;
 - 将步骤1新创建的对象作为this的上下文 ;
 - 如果该函数没有返回对象,则返回this。
 
new.target
- 允许你检测函数或构造方法是否是通过new运算符被调用的。
 - 在通过new运算符被初始化的函数或构造方法中,new.target返回一个指向构造方法或函数的引用。
 - 在普通的函数调用中,new.target 的值是undefined。
 
function myNew(F, ...args) {
  if (typeof F !== 'function') {
    throw 'new 操作符第一个参数必须是函数'
  }
  myNew.target = F // 指向构造函数
  let o = Object.create(F.prototype)
  let r = F.apply(o, args)
  return typeof r === 'object' || typeof r === 'function' || r !== null ? r : o  
}
 1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9