可是,如果我們將這些代碼寫成一個通用函數,而那個函數軀殼也就成了函數內的函數,這個內部函數不就可以在外層函數退出作用域後自動消亡嗎?而且,我們可以將原型對象作爲通用函數的參數,讓通用函數返回創建的對象。我們需要的就是下面這個形式:
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#那些靜態對象語言的形式了,這樣的代碼顯得多麼文靜而優雅啊!