2012-04-23 4 views
11

私はこの2日間、私の頭を叩いています。何らかの理由で、バックボーンは、継承された子モデル間で親インスタンスデータを共有しています。 HERESに例:私が探している何Backbone.js:モデル継承により共有データが発生する

var Base = Backbone.Model.extend({ 

    index : [] 

}); 

var Group = Base.extend({ 

    initialize : function() { 
    this.index.push('from group'); 
    } 

}); 


var User = Base.extend({ 

    initialize : function() { 
    this.index.push('from user'); 
    } 

}); 


var user = new User(); 
console.log(user.index); // ['from user'] 


var group = new Group(); 
console.log(group.index) // ['from user', 'from group'] 

は次のとおりです。

console.log(user.index); // ['from user'] 
console.log(group.index) // ['from group'] 

任意の洞察力?

ありがとうございます! Matt

答えて

14

あなたが経験していることは、本質的に、JSが値ではなく参照によってオブジェクト(または配列)を渡す方法の副産物です。ユーザとグループのインデックスを異なるようにするには、単純にinitialize関数で配列としてインスタンス化します。それはベースのプロトタイプチェーン内にありますので、それはまた、共有されている含まれている方法のようにすべてのインスタンスによって共有されるという点で

var Base = Backbone.Model.extend({ 

initialize: function() { 
    this.index = []; 
} 


}); 
+0

ありがとうございました。私は本当に 'extend()'がオブジェクト/配列をクローンすることによってこの問題を避けることを望んでいました。親クラスの配列とオブジェクトを定義するこのような習慣は、意図しない結果を招く可能性があるため避けてください。 – Matt

+3

このようなクラスにオブジェクトや配列を定義する理由はありますが、インデックスをインスタンス変数として使用し、各インスタンスに固有のものをクラス変数などのすべてのインスタンス間で共有することを目的としています。インスタンス変数が必要な場合は、継承するオブジェクトに定義してはいけませんが、クラス変数を使用する場合は、そのようにしてください。 Skylarが示しているように、親のコンストラクタでインスタンス変数を定義するのにも問題ありません。 – chubbsondubs

6

インデックス部材は、クラス変数のようなものです。インスタンス化するユーザーとグループの順序を切り替えてみてください。インデックスには何が含まれていますか?それは逆の権利ですか?それは、オブジェクトが継承するすべてのものを共有しているからです。

これをインスタンス変数にするには、Baseのコンストラクターでインスタンス化し、それぞれのコンストラクターからそのコンストラクターを呼び出す必要があります。 Like:

var Base = Backbone.Model.extend({ 
    initialize: function() { 
     this.index = []; 
    } 
}); 

var User = Base.extend({ 
    initialize: function() { 
     Base.prototype.initialize.call(this); 
     this.index.push('User'); 
    } 
}); 

// repeat it for group. 
+0

ありがとうございました。これは問題を解決する別の方法です。 – Matt

関連する問題