2012-07-15 79 views
12

我正在玩JavaScript,特別是用類和whatnot模擬面向對象編程。複製原型繼承?

我知道實現繼承

MyClass.prototype = new AnotherClass(); 

的這種方式,但我並不滿足,我不喜歡我怎麼需要調用AnotherClass構造。所以我在玩耍,我想出了一些似乎可行的事情,基本上想要第二個意見。

function clone (obj) 
{ 
    function CloneFactory() {} 
    CloneFactory.prototype = obj; 

    return new CloneFactory(); 
} 

MyClass.prototype = clone(AnotherClass.prototype); 

通過克隆原型,我們得到的是一個新的副本,並分配到MyClass的原型,以便改變繼承屬性不會影響父母的原型的屬性。像這樣MyClass.prototype = AnotherClass.prototype

我跑了壓力測試,這在某些情況下更有效率,也就是說,當父項的構造函數中有很多代碼時,它會大致相同。另一個好處(或者至少我發現它是有益的)是它在一定程度上允許從子類中隱藏信息。任何特權方法和成員都不會被繼承。

我忽略了一些重大缺陷嗎?

我不是JavaScript的專家,實際上我對JavaScript很陌生,所以我想對此有第二個意見,因爲我似乎無法通過Google找到任何內容。我不想執行錯誤的代碼:)!

回答

17

這是差不多正是Object.create所做的。你寫的函數是該方法的一個非常標準的「polyfill」。

這是一種抽象對象創建的真正常用方式,它更貼近地反映了「真實」原型繼承。絕對是一種安全的做事方式。

哦,這裏的MDN條目的鏈接Object.create,如果你有興趣:https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Object/create/

你會發現在底部,他們實際上包括填充工具,這是相當多的代碼相同,除了一些安全檢查和變量名稱。

+0

謝謝!直到現在,我甚至都不知道「Object.create」。 – SpaceFace 2012-07-15 01:10:16