分解 new 运算符
- 创建一个空的简单 JavaScript 对象(即 {});
- 为步骤 1 新创建的对象添加属性
__proto__
,将该属性链接至构造函数的原型对象; - 将步骤 1 新创建的对象作为
this
的上下文; - 如果该函数没有返回对象,则返回
this
手写一个new
function myNew() {
const obj = {}
const args = Array.prototype.slice.call(arguments, 0)
const ctor = args.shift()
obj.__proto__ = ctor.prototype
ctor.apply(obj, args)
return obj
}
另一个更好理解的版本,善用ES6解构,则不需要做类数组转数组的操作
function myNew(ctor, ...args) {
const obj = {}
obj.__proto__ = ctor.prototype
ctor.apply(obj, args)
return obj
}