JavaScript 構(gòu)造函數(shù)的返回值
■知識點
構(gòu)造函數(shù)允許使用return語句。如果返回值為簡單值,則將被忽略,直接返回this指代的實例對象;如果返回值為對象,則將覆蓋this指代的實例,返回return后面跟隨的對象。
為什么會出現(xiàn)這種情況呢?這與new命令解析過程有關(guān)系,使用new命令調(diào)用函數(shù)的解析過程
如下。
第1步,當(dāng)使用new命令調(diào)用函數(shù)時,先創(chuàng)建一個空對象,作為實例返回。
第2步,設(shè)置實例的原型,指向構(gòu)造函數(shù)的prototype屬性。
第3步,設(shè)置構(gòu)造函數(shù)體內(nèi)的this值,讓它指向?qū)嵗?/p>
第4步,開始執(zhí)行構(gòu)造函數(shù)內(nèi)部的代碼。
第5步,如果構(gòu)造函數(shù)內(nèi)部有return語句,而且return后面跟著一個對象,會返回return語句指定的對象;否則會忽略return返回值,直接返回this對象。
■實例設(shè)計
下面的示例在構(gòu)造函數(shù)內(nèi)部定義return返回一個對象直接量,當(dāng)使用new命令調(diào)用構(gòu)造函數(shù)時,返回的不是this指代的實例,而是這個對象直接量,因此當(dāng)讀取x和y屬性值時,與預(yù)期的結(jié)果是不同的。
function Point(x,y) //構(gòu)造函數(shù)
this.x = x; //私有屬性
this.y = y; //私有屬性
return { x : true, y : false }
}
var pi = new Point(100,200); //實例化對象1
console.log(pi.x); //true
console.log(pi.y); //false
點擊加載更多評論>>