# 模拟new操作符

new关键字

MDN new运算符 (opens new window)

  1. 创建一个空的简单JavaScript对象(即{});
  2. 链接该对象(即设置该对象的构造函数)到另一个对象 ;
  3. 将步骤1新创建的对象作为this的上下文 ;
  4. 如果该函数没有返回对象,则返回this。

new.target

MDN new.target (opens new window)

  1. 允许你检测函数或构造方法是否是通过new运算符被调用的。
  2. 在通过new运算符被初始化的函数或构造方法中,new.target返回一个指向构造方法或函数的引用。
  3. 在普通的函数调用中,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