javascript - 多重継承の質問

javascript function-prototypes

プロトタイプチェーンをいじり回していると、説明できないことがわかりました。私はまだこれらすべてを学んでいるので、それはおそらく私が犯した間違いです。私は他の多くの人のように、いくつかの多重継承をしようとしています。私はプロトタイプオブジェクトがハッシュ/辞書のように見えることに気づきました。アンダースコア。エクステンドのようなものを使用して、複数のプロトタイプオブジェクトを1つにマージしてみませんか。

function A(){this.value="A";};
A.prototype.funcA = function (){console.log(this.value);}
function B(){this.value="B";};
B.prototype.funcB = function (){console.log(this.value);}

function C(){
  // fix constructor
  this.constructor = C;
  // 'inherit' properties
  A.call(this);
  B.call(this);
};
// gobble up the prototype chains of A and B
C.prototype = new underscore.extend(A.prototype,B.prototype);
C.prototype.funcC = function (){console.log(this.value);}
var c = new C();

> c instanceof C
true
> c instanceof A
true
> c instanceof B
false


ここで本当のことを聞いて本当に驚いています。誰かがここで何が起こっているのか説明できますか?

更新
下線の拡張メソッドをコードから削除しました。ありがとう!

function extend(destination, source) {
  for (var property in source) {
    if (source.hasOwnProperty(property)) {
      destination[property] = source[property];
    }
  }
  return destination;
};

function A(){this.value="A";};
A.prototype.funcA = function (){console.log(this.value);}
function B(){this.value="B";};
B.prototype.funcB = function (){console.log(this.value);}

function C(){
  this.constructor = C;
  A.call(this);
  B.call(this);
};
var destination = {};
destination = extend(destination,A.prototype);
destination = extend(destination,B.prototype);
C.prototype = destination;
C.prototype.funcC = function (){console.log(this.value);}
var c = new C();
> c
{ constructor: [Function: C], value: 'B' }
> c instanceof A
false
> c instanceof B
false
> c instanceof C
true
答え
1つのオブジェクトは1つのプロトタイプしか持つことができないため、JavaScriptには多重継承はありません。もちろん、1つの値のみを返すECMAScript 5 Object.getPrototypeOfメソッドを確認するだけで十分です。古いインタプリタの場合は、単に__proto__obj.constructor.prototypeプロパティ(非標準)を試すことができます。

作成した例では、2つの異なるプロトタイプのすべての機能を使用できる可能性がありますが、プロトタイプチェーンにブレーキがかかります。これが、instanceof演算子がAおよびBに対してfalseを返す理由です。実際、AまたはBのプロトタイプはプロトタイプではありません。あなたのオブジェクトの、しかしあなたがextend関数を使って作ったそれらのミックスイン。関数名は非常に誤解を招きやすい(ただし、このような名前は一部のフレームワークおよびライブラリで使用されます)-オブジェクトを拡張しないため(オブジェクト指向プログラミングの意味で)、2つのオブジェクトのミックスインを構築します-これは完全に異なる設計ですパターン。

トピックから少し外してください-オブジェクトとプロトタイプの継承を実験している場合-(ECMAScript 5の)Object.createメソッドを試してみてください。この場合、非常に便利です。
関連記事

javascript - jQueryを使用して列の値の総数を集計するにはどうすればよいですか?

javascript - <img>要素を取得して、そのエラーを再評価するにはどうすればよいですか?

javascript - Djangoは組み込みウィジェットをローカライズします

javascript - Google Maps v3マーカーイベント

javascript - プログラムでテキストボックスの値を変更するとIE8が変更イベントを起動する

javascript - JCropがJavaScriptコードで機能しない

javascript - NodeJS用のRDF / XML JavaScriptコンバーターへのN-triples

javascript - javascript関数がオブジェクトの場合、なぜこれが機能しないのですか

javascript - ステートメントとImg問題について

javascript - node.jsのhttp.requestからブラウザに応答を送信する方法は?