JavaScript不是一個真正的OO語言,但是通過提供prototype對象實現了一些OO的特性。本文是作者在使用JS中OO特性的一些心得體會。
下面我們首先來看一下如何在JavaScript中定義一個類(不使用prototype):
{
this.name = "name";
this.show = function()
{
alert(this.name);
}
}
以上這段代碼中,我們聲明瞭一個類Base,並且爲該類添加了一個成員變量name和一個成員函數show,通過經下代碼就可以實現生成該類的一個實例:
base.show();
但是這種聲明類的方法有一個明顯的不足之處,每當新建該類的一個實例時,我們都會創建所有方法的一個副本,也就是說,所有類的show方法是在內存中的不同地址的,而且類的成員變量的聲明與定義被放到了一起,比較容易產生混淆。下面,我們通過引入prototype機制來實現清晰的類定義。
{
// Constructor here.
// ...
}
Base.prototype =
{
name: "base",
show: function()
{
alert(this.name);
}
}
現在我們來看new的執行過程:
1、創建一個新的對象,並讓this指針指向它;
2、將函數的prototype對象的所有成員都賦給這個新的對象;
3、執行函數體,對這個對象進行初始化操作;
4、返回(1)中創建的對象。
現在在new的執行過程當中,多了用prototype來初始化對象的過程,這也和prototype的字面意思相符,它是所對應類的實例的原形。這個初始化過程發生在函數體(constructor)執行之前,所以在函數體內部可以調用prototype中定義的屬性和方法。