2

私は基本クラスを持っています

function Base(){
    this.children = new Array();
}
Base.prototype.Add = function(child){
    this.children.push(child)
}

function Sub1(){...}
Sub1.prototype = new Base();

function Sub2(){...}
Sub2.prototype = new Base();

だからどうして私がするとき

var S1_1 = new Sub1();
var S1_2 = new Sub1();
S1_1.Add(new Sub2());

何らかの理由で S1_2 にも 1 つの子があり、S1_1 に追加した子と同じ情報が含まれていますか?

4

2 に答える 2

6

これは、プロトタイプの継承がどのように機能するかによるものです。すべてのSub1オブジェクトは、共通のオブジェクトから継承しBaseます。Baseオブジェクトは配列を保持するため、すべてのSub1インスタンスがその配列を共有します。

つまり、.childrenSub1オブジェクトのプロパティを要求すると、そのようなプロパティを所有していないことがわかり、継承元のプロトタイプでそれを探します。同じプロトタイプ オブジェクトから継承するため、同じ配列を使用します。


それぞれSub1が独自の配列を持つようにするには、Sub1コンストラクターで定義する必要があります。

function Base(){
    this.children = new Array();
}
Base.prototype.Add = function(child){
    this.children.push(child); // `this` will be whatever object invoked the method
}

function Sub1(){
    this.children = [];
}
Sub1.prototype = new Base();

function Sub2(){
    this.children = [];
}
Sub2.prototype = new Base();
于 2013-06-23T23:17:47.850 に答える
0

ownershipサブを作成するときに定義された Base 変数の /copy を取得しませんでしたthis。次のようにして実行できます。

function Sub1(){
  Base.call(this);
}

このコードが行うことは、Sub1 インスタンスをthisコンテキストとして Base を呼び出すことです。

プロトタイプの動作の詳細については、次を参照してください:プロトタイプの継承 - 執筆

于 2013-06-23T23:48:25.997 に答える