js new的实现原理

new

我们调用new的过程中会发生以下四件事:

1、新生成了一个对象

2、链接到原型

3、绑定this

4、返回新对象

根据这个过程,我们可以试着来实现一个new

function create() {
  // 创建一个空对象
  let obj = {}
  // 获取构造函数
  let Con = [].shift.call(arguments)
  // 设置空对象的原型
  obj.__proto__ = Con.prototype
  // 绑定 this 并执行构造函数
  let result = Con.apply(obj, arguments)
  // 确保返回值为对象
  return result instanceof Object ? result : obj
}

其实啊,对象都是通过new产生的,无论是let a = { b : 1 }还是function Foo()

对于创建一个对象来说,更推荐使用「字面量」的方式来创建对象。

无论是从「可读性」还是从「性能」上考量,都更推荐使用「字面量」的方式。

因为你使用new Object()的方式创建对象需要通过「作用域链」一层层找到Object,但使用字面量方式就没这个问题。

function Foo() {}
// 其实,function就是个语法糖
// 内部等同于 new Function()
let a = { b: 1 }
// 这个字面量内部使用了 new Object()