2009-10-02 51 views
2

在他sitepoint文章關於javascript inheritance,哈利Fuecks解釋實現繼承的方式如下:Javascript繼承的實現問題

function copyPrototype(descendant, parent) { 
    var sConstructor = parent.toString(); 
    var aMatch = sConstructor.match(/\s*function (.*)\(/); 
    if (aMatch != null) { descendant.prototype[aMatch[1]] = parent; } 
    for (var m in parent.prototype) { 
     descendant.prototype[m] = parent.prototype[m]; 
    } 
}; 

雖然我理解他的代碼,一個問題浮現在腦海 - 爲什麼不去掉for循環並乾脆這樣做:

function copyPrototype(descendant, parent) { 
    var sConstructor = parent.toString(); 
    var aMatch = sConstructor.match(/\s*function (.*)\(/); 
    if (aMatch != null) { descendant.prototype[aMatch[1]] = parent; } 
    descendant.prototype = parent.prototype; 
}; 

謝謝。

+3

這是一種可怕的方式來實現繼承 - 功能反編譯,手動複製屬性(甚至沒有照顧DontEnum錯誤),而不是更有效的原型方法等。 – kangax 2009-10-02 02:46:34

+0

隨時發佈您的做法 – 2009-10-02 04:03:03

+1

我會建議閱讀克羅克福德的文章(http://www.crockford.com/javascript/inheritance.html),瞭解一個簡單的以初學者爲中心的JS繼承概述。爲了更深入瞭解,請查看Michaux(http://peter.michaux.ca/articles/class-based-inheritance-in-javascript)或Giammarchi(http://www.3site.eu/doc/)文章。 – kangax 2009-10-02 05:09:25

回答

3

將一個functionprototype分配給另一個只會分配對原始的prototype的引用;兩者將共享相同的prototype對象。遍歷prototype創建其所有成員的淺表副本。

+1

這不是從另一個對象繼承時想要什麼?父母的任何改變都不應該反映在後代? – 2009-10-02 01:16:59

+0

在某些情況下,是的。但是你肯定不希望改變父母身上反映的後代。 – 2009-10-02 01:18:25

+0

而不是分配一個函數的原型到另一個函數,我將我的「子類」函數的原型分配給一個新的MyParentClass(),如Javascript Rhino書籍第169頁所述。那是錯的/不好的? PositionedRectangle.prototype = new Rectangle(); – 2009-10-02 02:19:44