能否實現js的new操作符
new
new運算符創建了一個用戶自定義的對象類型的實例或具有構造函數的內置對象類型之一
定義一個構造函數Student,該函數接收兩個參數name和age:
function Student(name,age){
this.name=name
this.age=age
}
let first=new Student('dylan','26')
console.log(first.name);// dylan
console.log(first.age);// 26
new實現了那些功能:
- 創建了一個空對象
- 空對象的原型指向了構造函數的原型
- 讓this指向新創建的空對象,並且執行對象的主體(為這個新對象添加屬性)
- 判斷返回值的類型,如果是值類型就返回新創建的對象,如果是引用類型,就返回這個引用類型的對象
- 如果函數沒有返回對象類型Object(包括Functoin, Array, Date, RegExg, Error),那么new表達式中的函數調用將返回該對象的引用
function copyNew(obj,...args){
//1.創建了一個空對象
const newObj={}
//2. 空對象的原型指向了構造函數的prototype
newObj.__proto__=obj.prototype
//上面的兩步可以合為一步
// let newObj=Object.create(obj.prototype)
//3. 將obj的this改為新創建對象
let result=obj.apply(newObj,args)
//判斷類里面有返回值嗎?返回值是對象嗎?如果是的那那就返回類中的返回值,如果不是的話那就返回新創建的對象
return typeof result ==='object'?result:newObj
}
如果構造函數返回了一個“對象”,那么這個對象會取代整個new出來的結果。如果構造函數沒有返回對象,那么new出來的結果為步驟1創建的對象。(一般情況下構造函數不返回任何值,不過用戶如果想覆蓋這個返回值,可以自己選擇返回一個普通對象來覆蓋。當然,返回數組也會覆蓋,因為數組也是對象。
