最近更新: 2006-08-31

JavaScript 的個體繼承之成員的配置工作

當衍生類別 (derived class) 繼承了基底類別 (base class) 的成員時,常常忘了要初始 (配置) 那些成員,亦即呼叫基底類別的建構函數。這是 OOP 初學者,也是 JavaScript programmer 在實作繼承關係時易犯的毛病。

在「物件properties在繼承時出問題???」一文中,該作者反應的問題,其實是 OOP 初學者易犯的毛病。觀看該作者的 source code ,不難看出問題出在何處,用 C++ 的說法來解釋,就是作者在實作衍生類別時,忘了初始 (配置) 繼承自基底類別的成員。 JavaScript 並沒有類別繼承的概念,反而它是用一個已存在的 object 生成 (new) 一個新的 object ,個體成員是以類似 C++ 中的 copy constructor 方式建立的。因此,一個衍生個體 (derived object) 中屬於 Object Type ( See also: Standard ECMA-262 3rd Edition ch.8.6) 的成員,必定與基底個體 (base object) 參考同一份實體。如果衍生個體要擁有私有內容,則必須另行配置,亦即呼叫基底個體的建構函數。然而 JavaScript 本身並沒有提供一個便利的內建方法可用,需要自己寫。幸好這並不難。一個簡單有效的方法是,在建構子中,先配置一個暫時性的基底個體,然後將此暫時性個體的成員內容,一一指派給自己 (this) 的成員。因此,改寫「物件properties在繼承時出問題???」一文中的程式碼如下,即為該作者所要求的結果。

function mother () {
    this.fname = new Array;
}
mother.prototype.setfname = function (str) {
    this.fname.push(str);
}

function son (title) {
this.title = title;
var m = new mother;//配置一個暫時性的基底個體
    for(var i in m) {
        this[i] = m[i];
    }
}

var son1 = new son("workbee");
son1.setfname("test");

var son2 = new son("manager");
son2.setfname("test2");

alert(son.prototype.fname);
alert(son1.fname);
alert(son2.fname);
相關文章
樂多舊網址: http://blog.roodo.com/rocksaying/archives/2087071.html