new 运算符创建一个用户定义的对象类型的实例或具有构造函数的内置对象类型之一

原理

MDN 对 new 解释的操作步骤如下:

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

考虑返回值

  • 假如构造函数有返回值且是对象,返回这个对象

  • 假如构造函数有返回值且不是对象,返回创建的空对象

  • 假如构造函数没有返回值,返回创建的空对象

实现

function myNew() {
  let obj = {}
  let Constructor = [].shift.call(arguments)
  obj.__proto__ = Constructor.prototype
  let ret = Constructor.apply(obj, arguments)
  return typeof ret === 'object' ? ret : obj
}

可以使用 new 一个箭头函数吗?

箭头函数没有 prototype、没有自己的 this 指向、不可以使用 arguments、自然不可以 new