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操作符調(diào)用構(gòu)造函數(shù)經(jīng)歷的步驟
- 創(chuàng)建一個(gè)新對(duì)象,繼承構(gòu)造函數(shù)的原型對(duì)象
- 將構(gòu)造函數(shù)的作用域賦給新對(duì)象(this指向新對(duì)象)
- 執(zhí)行構(gòu)造函數(shù)中的代碼
- 返回新對(duì)象
返回的對(duì)象有三種情況
- 構(gòu)造函數(shù)沒有指定返回值,則返回構(gòu)造函數(shù)的實(shí)例化對(duì)象
- 構(gòu)造函數(shù)中返回值不是引用類型,則也返回構(gòu)造函數(shù)的實(shí)例化對(duì)象
- 構(gòu)造函數(shù)中返回值為引用類型,則返回該應(yīng)用類型
注:object.create()
let obj = Object.create(func.prototype) => 將obj的 [[Prototype]] 屬性指向func構(gòu)造函數(shù)的原型對(duì)象上