1

このパターンをJSの継承に使用しました

MyApp.utils = {
    extend: function (subClass, baseClass, subClassMethods) {
        function inheritance() { }
        inheritance.prototype = baseClass.prototype;
        subClass.prototype = new inheritance();
        subClass.prototype.constructor = subClass;
        subClass.baseConstructor = baseClass;
        subClass.superClass = baseClass.prototype;

        if (subClassMethods == null) return;

        for (var index in subClassMethods) {
            subClass.prototype[index] = subClassMethods[index];
        }
    }
};

あなたはそれを次のように使用します

MyApp.utils.extend(SubClass, BaseClass, {
    subMethodOne: function() {        
    }
});

これはうまく機能し、コードは非常に単純ですが、コンストラクター呼び出しがベースクラスではなくサブクラスになり、スタック オーバーフローが発生するため、多重継承では機能しません。

多重継承に最適なパターンは何ですか? プロトタイプをサポートし、各クラスで個別のコンストラクター ロジックをサポートする必要があります。

JSFiddle: http://jsfiddle.net/HcPhL/1/ FF がクラッシュするので注意してください :D

4

2 に答える 2

1

JavaScript の継承はプロトタイプ ベースです。これは、オブジェクトがクラスではなく相互に継承することを意味します。あなたが知っている他のプログラミング言語のイディオムを使おうとする代わりに、JavaScript 独自のイディオムを学ぶことをお勧めします。モジュールの使用、クローン作成、機能のコピー (関数はオブジェクトであるため) は、javascript での従来の継承よりもはるかに便利です。

つまり、やりたいことは次の方法で実現できます。

AがBおよびCの種類のオブジェクトから継承するようにします。

  1. Aという名前の新しいオブジェクトを作成します
  2. B の各プロパティを反復処理し (for... in ループを使用)、それを A に割り当てます。
  3. C の各プロパティを反復処理し (for... in ループを使用)、それを A に割り当てます。ここで、競合の解決方法 (つまり、B または C のどのメソッドを優先するか) を検討する必要があります。

拡張機能を備えたオープンソースの JavaScript ライブラリがたくさんあります。そこで実装を確認できます。Douglas Crockford には、継承を達成する方法に関する基本的な記事もあります

あなたが達成しようとしているのはコードの再利用だと思います。Addy Osmani learning javascript design patternsによるこの無料の本をご覧になることをお勧めします。特にモジュールパターン。

于 2012-09-03T10:03:33.717 に答える