Я бы предположил, что ваша проблема - это ваш defaults
в Player
:
var Player = Backbone.Model.extend({
defaults: {
id: 0,
name: '',
coins: new Coins()
},
//...
});
То, что defaults
будет неточно скопировано в новый Player
s, так что они все в конечном итоге обмениваются точно такими же coins: new Coins()
. Подобные вещи случаются всякий раз, когда defaults
содержит любые изменяемые данные (т. Е. Массивы, литералы объектов, ...). Таким образом, все из них:
this.Taylor.get("coins")
this.Sugar.get("coins")
this.Darlene.get("coins")
this.Cody.get("coins")
окажется в точности как тот же самый объект. В fine manual сказано следующее:
defaults
model.defaults or model.defaults()
Хэш (или функция) по умолчанию может использоваться для указания значения по умолчанию атрибуты для вашей модели. При создании экземпляра модели любые неопределенные атрибуты будут установлены в их значение по умолчанию. [...] Помните, что в JavaScript объекты передаются по ссылке, поэтому, если вы включаете объект в качестве значения по умолчанию, он будет использоваться для всех экземпляров.
blockquote>Обратите внимание, что в конце немного оговорено. Если вы используете функцию для
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... }, //... });