new 運算符接受一個構造器
和一組調用參數
,實際上做了幾件事:
- 以構造器的prototype屬性為原型,創建新對象;
- 將this和調用參數傳給構造器,執行;
- 如果構造器返回的是對象,則返回,否則返回第一步創建的對象。
function create() {
// 1.創建一個全新的對象
let obj = new Object();
//獲取構造函數
let Con = [ ].shift.call(arguments);//拿到第一個元素
// 2.將對象的__proto__指向構造函數的prototype對象
obj.__proto__ = Con.prototype;
//使用新的api obj = Object.setPrototypeOf(obj,Con.prototype);
// 3.綁定this, 以及參數;
let result = Con.apply(obj,arguments)
//4.確保返回的是對象(如果構造器沒有返回其他對象,則自動返回這個新對象)
return typeof result === 'object' ? result : obj;
}
function create(){
//獲取構造函數
let Con = [].shift.call(arguments);
//以構造函數為原型創建一個新對象
let obj = Object.create(Con);
//綁定this及其參數
let result = Con.apply(obj,arguments);
return typeof result === 'object'? result:obj;
}