我们调用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()