悟透JavaScript之原型真諦---(2)

可是,如果我們將這些代碼寫成一個通用函數,而那個函數軀殼也就成了函數內的函數,這個內部函數不就可以在外層函數退出作用域後自動消亡嗎?而且,我們可以將原型對象作爲通用函數的參數,讓通用函數返回創建的對象。我們需要的就是下面這個形式:

function New(aClass, aParams) //通用創建函數

{

function new_() //定義臨時的中轉函數殼

{

aClass.Create.apply(this, aParams); //調用原型中定義的的構造函數,中轉構

造邏輯及構造參數

};

new_.prototype = aClass; //準備中轉原型對象

return new new_(); //返回建立最終建立的對象

};

var Person = //定義的類

{

Create: function(name, age)

{

this.name = name;

this.age = age;

},

SayHello: function()

{

alert("Hello, I'm " + this.name);

},

HowOld: function()

{

alert(this.name + " is " + this.age + " years old.");

}

};

var BillGates = New(Person, ["Bill Gates", 53]); //調用通用函數創建對象,並以數

組形式傳遞構造參數

BillGates.SayHello();

BillGates.HowOld();

alert(BillGates.constructor == Object); //輸出:true

這裏的通用函數New()就是一個語法甘露!這個語法甘露不但中轉了原型對象,還中轉了構造函數邏輯及構造參數。

有趣的是,每次創建完對象退出New 函數作用域時,臨時的new_函數對象會被自動釋放。由於new_prototype 屬性被設置爲新的原型對象,其原來的原型對象和new_之間就已解開了引用鏈,臨時函數及其原來的原型對象都會被正確回收了。上面代碼的最後一句證明,新創建的對象的constructor 屬性返回的是Object 函數。其實新建的對象自己及其原型裏沒有constructor 屬性,那返回的只是最頂層原

型對象的構造函數,即Object

有了 New 這個語法甘露,類的定義就很像C#那些靜態對象語言的形式了,這樣的代碼顯得多麼文靜而優雅啊!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章