1

プロトタイプの継承でコードを再利用する方法に少し混乱しています。http://alexsexton.com/?p=51の例に従っています。ここでは Speaker オブジェクトを作成し、jQuery でブリッジします。

例のスピーカーに似た新しいスピーカーが欲しいとしますが、追加のサウンドファイルが追加されました。私が考えることができる唯一のコードは次のようなものです:

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ます。差分継承を行うことになっていると思いますが、方法がわかりませんか? 何か助けはありますか?

4

2 に答える 2

0

オブジェクト指向が新しくなったとき、継承はコードの再利用に適していると考えるのが一般的でした。新しい知恵は、継承が高い結合度を作成し、多くの場合、継承ではなく集約を使用した方が再利用が可能になるというものです。

リンク先の記事にアクセスできなかったため、具体的に説明することはできません。

于 2011-07-26T09:46:36.453 に答える
0

あなたはすでに差分継承を行っています(AnotherSpeakerとは対照的に何が違うのかを指定していますSpeaker)。

Speaker.speakviaへの「スーパーコール」に関する問題についてcall: はい、それは苦痛です。スーパーコールは、そのままでは JavaScript があまり役に立たない領域です。使用している構造では、おそらくそれが最善の方法です。

数年前、私はスーパーコールを簡単かつ効率的にするためのシステムを定義しました。ヘルパー関数を使用してコンストラクター関数を作成する必要があります (この記事ではそれらをクラスと呼んでいますが、その時点ではクラスからプロトタイプへの移行を頭の中でまだ行っていなかったという成果物です) が、用語は別として、実際にはプロトタイプの継承。役に立つかもしれません。

于 2011-07-26T09:41:05.013 に答える