new的实现
使用 new 命令调用函数的解析过程如下:
- 当使用 new 命令调用函数时,先创建一个空对象,作为实例返回。
- 设置实例的原型,指向构造函数的 prototype 属性。
- 设置构造函数体内的 this 值,让它指向实例。
- 开始执行构造函数内部的代码。
- 如果构造函数内部有 return 语句,而且 return 后面跟着一个对象,会返回 return 语句指定的对象;否则会忽略 return 返回值,直接返回 this 对象。
new过程的代码实现:
function Foo(e) {
this.name = 'wn';
this.age = age;
}
function objectFactory() {
const obj = {}
// 将参数中的第一个移出
const Constructor = [].shift.call(arguments)
obj._proto_ = Constructor.prototype
const ret = Constructor.apply(obj, arguments)
return typeof ret === 'object'? ret : obj
}