defaults
あなたの問題はあなたの中にあると思いますPlayer
:
var Player = Backbone.Model.extend({
defaults: {
id: 0,
name: '',
coins: new Coins()
},
//...
});
それdefaults
は new に浅くコピーされるPlayer
ため、それらはすべてまったく同じ を共有することになりますcoins: new Coins()
。defaults
変更可能なデータ (つまり、配列、オブジェクト リテラルなど) が含まれる場合は常に、同様のことが起こります。したがって、これらすべて:
this.Taylor.get("coins")
this.Sugar.get("coins")
this.Darlene.get("coins")
this.Cody.get("coins")
まったく同じオブジェクトになります。細かいマニュアルには次のように書かれています。
デフォルト model.defaults or model.defaults()
デフォルトハッシュ (または関数) を使用して、モデルのデフォルト属性を指定できます。モデルのインスタンスを作成するとき、未指定の属性はデフォルト値に設定されます。
[...]
JavaScript では、オブジェクトは参照によって渡されるので、オブジェクトをデフォルト値として含めると、すべてのインスタンスで共有されることに注意してください。
最後にちょっとした注意事項があります。関数を使用する場合defaults
:
var Player = Backbone.Model.extend({
defaults: function() {
return {
id: 0,
name: '',
coins: new Coins()
};
},
//...
});
'coins'
次に、それぞれについて区別する必要がありますPlayer
。または、次のように手動で設定することもでき'coins'
ますinitialize
。
var Player = Backbone.Model.extend({
//...
initialize: function() {
this.set('coins', new Coins);
// Or only set it if it isn't there if that makes sense...
},
//...
});