new执行了哪些步骤
- 创建一个空的简单js对象(即{})
- 将该空对象的原型(
__proto__
)指向构造函数的原型属性(prototype
)
- 将创建的空对象作为构造函数this的上下文, 然后执行构造函数(this指向这个新对象)
- 如果该函数没有返回, 则返回创建的对象
- 如果函数没有返回值(没有return语句), 那么就会返回构造函数的实例
- 如果函数返回了一个基本数据类型的值, 那么本次构造函数的返回值是该实例
- 如果函数返回了一个复杂数据类型的值, 那么本次函数的返回值就是该值
手写实现
function _new() {
let [constructor, ...args] = [...arguments]
let obj = {}
obj.__proto__ = constructor.prototype
let result = constructor.call(obj, ...args)
return typeof result === 'object' ? result : obj
}
function _new(Parent, ...rest) {
let obj = Object.create(Parent.prototype)
let result = Parent.apply(obj, rest)
return typeof result === 'object' ? result : obj
}