function imitateNew(func, ...args) {
let obj = Object.create(func.prototype);
let o = func.apply(obj, args);
return typeof o === 'object' ? o : obj;
}
let person = imitateNew(function(name, age) {
this.name = name;
this.age = age;
}, 'Alima', 17)
// {name: "Alima", age: 17}
使用new操作符调用构造函数经历的步骤
- 创建一个新对象,继承构造函数的原型对象
- 将构造函数的作用域赋给新对象(this指向新对象)
- 执行构造函数中的代码
- 返回新对象
返回的对象有三种情况
- 构造函数没有指定返回值,则返回构造函数的实例化对象
- 构造函数中返回值不是引用类型,则也返回构造函数的实例化对象
- 构造函数中返回值为引用类型,则返回该应用类型
注:object.create()
let obj = Object.create(func.prototype) => 将obj的 [[Prototype]] 属性指向func构造函数的原型对象上