在javascript中有多種方法可以定義一個類
1.Factory 方法function createDuck()
{
var temp = new Object;
temp.address = "bj";
temp.color = "black";
temp.show = function()
{
alert(temp.color);
}
return temp;
}
var d1 = createDuck();
var d2 = createDuck();
在上面的代碼中我們定義了一個createDuck方法,在這個方法裡我們通過new Object來建立一個新的對象,並給它添加新的屬性和方法,最後返回建立的對象。
在下面我們通過這個方法來將產生的對象賦給變數。但是這種產生對象的方式有一個很嚴重的問題就是每次建立新對象時都會重複建立show函數,這意味著每個對象事實上都擁有一個不同的show方法,要解決這個問題我們需要在createDuck方法前再建立一個show方法,而後在createDuck方法內部通過賦予對象指標的方式來解決。function Show()
{
alert(this.color);
}
function createDuck()
{
var temp = new Object;
temp.address = "bj";
temp.color = "black";
temp.show = Show;
return temp;
}
var d1 = createDuck();
var d2 = createDuck();
但是用這種方式建立看起來不是那麼的物件導向了。
2.建構函式方式
這樣就有第二種建構函式方式來建立類,建構函式方式和Factory 方法方式類似,在定義時選擇好類名來建立如:function Duck()
{
this.address = "bj";
this.color = "black";
this.show = function()
{
alert(this.color);
}
}
var d1 = new Duck();
var d2 = new Duck();
不過上面這種方式和我們在Factory 方法裡建立對象時的第一個樣本有同樣的問題,那就是重複建立了show方法。雖然同樣可以用第二個樣本那樣來解決這個問題,不過那樣的話同樣顯的不那麼的物件導向了。
3.原型方式
我們先看看原型方式是怎麼樣的function Duck()
{}
Duck.prototype.address = 'bj';
Duck.prototype.color = 'black';
Duck.prototype.show = function()
{
alert(this.color);
}
var d1 = new Duck();
var d2 = new Duck();
在這種方式裡很好的解決了前面提到的這幾個問題,並且你通過instanceOf方法查看可以發現你建立的物件類型就是Duck類型。這樣看來我們似乎已經找到了最佳折建立類的方式,不過遺憾的是這種方式也不是那麼的完美的。假如我們想要在建構函式裡添加參數,就會發現沒辦法辦到。那麼怎麼辦呢,我們再來看看第四種方式
4.混合建構函式和原型方式
在這種方式裡我們通過建構函式方式來確定類的屬性,通過原型方式來定義類的方法。funtion Duck(address,color)
{
this.address = address;
this.color = color;
}
Duck.prototype.show = function()
{
alert(this.color);
}
var d1 = new Duck('bj','black');
var d2 = new Duck('jb','white');
這種方式應該是目前javascript當中比較好的一種建立類對象的方式。