JavaScripte中的Prototype機制(一)

JavaScript不是一個真正的OO語言,但是通過提供prototype對象實現了一些OO的特性。本文是作者在使用JS中OO特性的一些心得體會。

下面我們首先來看一下如何在JavaScript中定義一個類(不使用prototype):

function Base()
{
        
this.name = "name";
        
this.show = function() 
        
{
                alert(
this.name);
        }

}

以上這段代碼中,我們聲明瞭一個類Base,並且爲該類添加了一個成員變量name和一個成員函數show,通過經下代碼就可以實現生成該類的一個實例:

var base = new Base();
base.show();

但是這種聲明類的方法有一個明顯的不足之處,每當新建該類的一個實例時,我們都會創建所有方法的一個副本,也就是說,所有類的show方法是在內存中的不同地址的,而且類的成員變量的聲明與定義被放到了一起,比較容易產生混淆。下面,我們通過引入prototype機制來實現清晰的類定義。

function Base()
{
    
// Constructor here.
    // ...
}


Base.prototype 
= 
{
    name: 
"base",
    show: 
function()
    
{
        alert(
this.name);
    }

}

現在我們來看new的執行過程:
1、創建一個新的對象,並讓this指針指向它;
2、將函數的prototype對象的所有成員都賦給這個新的對象;
3、執行函數體,對這個對象進行初始化操作;
4、返回(1)中創建的對象。
現在在new的執行過程當中,多了用prototype來初始化對象的過程,這也和prototype的字面意思相符,它是所對應類的實例的原形。這個初始化過程發生在函數體(constructor)執行之前,所以在函數體內部可以調用prototype中定義的屬性和方法。

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