2011-07-26 93 views
1

我對如何通過原型繼承實現代碼重用感到有些困惑。我在http://alexsexton.com/?p=51的示例中創建一個Speaker對象,並使用jQuery進行橋接。通過Javascript重用代碼原型繼承

說我想要一個新的揚聲器,類似於示例中的揚聲器,但現在帶有額外的聲音文件。我能想到的唯一的代碼是這樣的:

var AnotherSpeaker = Object.create(Speaker); 

$.extend(true, AnotherSpeaker, { 
    init: function(options, elem){ 
     this.options.soundFile = options.soundFile || this.options.soundFile; 
     Speaker.init.call(this, options, elem); 
    }, 
    options:{ 
     soundFile: 'abc.wav' 
    }, 
    _playSound: function(){ 
     //....code to play the sound this.options.soundFile; 
    }, 
    speak: function(msg){ 
     this._playSound(); 
     Speaker.speak.call(this, msg); 
    } 
}); 

$.plugin('AnotherSpeaker', AnotherSpeaker); //jquery plugin bridge 

但是這種做法其實聽起來很「古典」給我。我通過Speaker.xxx.call呼叫'超級'。我想我應該做差別繼承但是不知道怎麼做?任何幫助?

+1

在JavaScript中模擬基於類的OOP以獲得重用效果並不理想。 Peter Michaux有一篇很好的文章[從Java類到JavaScript原型的過渡](http://michaux.ca/articles/transitioning-from-java-classes-to-javascript-prototypes),您可能會對此感興趣。 – RobG

+0

謝謝。這是一篇很好的文章。但在我看來,它最終決定使用mixin而不是原型繼承(沒有原型鏈保留)。那麼我們什麼時候應該使用原型繼承? – jackysee

+1

當你想創建一個對象的多個實例。我很少使用它們,大多數使用javascript幾年的人都會發現,模塊和類似模式在大多數情況下都是需要的。我認爲,因爲Web應用程序如此動態,保持簡單並重新編寫更新所需內容比保持複雜的繼承鏈和相互依賴關係更容易。通過片段重新使用似乎效果最好。 – RobG

回答

0

你已經在做差分繼承(指定AnotherSpeaker而不是Speaker的不同)。

關於你的問題與「supercall」Speaker.speak通過call:是的,這是一種痛苦。超級調用是一個JavaScript並不能幫助你開箱即用的領域。隨着你使用的結構,這可能是最好的方式來做到這一點。

幾年前I defined a system爲使超級調用既簡單又高效。它涉及到使用一個輔助函數來創建構造函數(我把它稱作文章中的類,這是我當時尚未將類與原型進行過渡的工件),但是除了術語外,實際上是原型繼承。你可能會覺得很有幫助。

0

當面向對象是新的時,通常認爲繼承對代碼重用是有利的。較新的看法是繼承會產生高度的耦合,並且通過聚合而不是繼承來實現重用通常會更好。

我無法聯繫到您鏈接的文章,因此我無法對您的案例進行更具體的描述。