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
Ответы
Ответ 1
То, что вы испытываете, по сути является побочным продуктом того, как JS передает объекты (или массивы) по ссылке, а не по значению. Если вы хотите, чтобы индекс был другим для пользователя и группы, просто создайте его как массив в своей инициализации.
var Base = Backbone.Model.extend({
initialize: function() {
this.index = [];
}
});
Ответ 2
Элемент индекса похож на переменную класса, поскольку он находится в цепочке прототипов базы и, таким образом, разделяется всеми экземплярами, так же, как и используемые им методы. Попробуйте переключить порядок экземпляра пользователя и группы. Теперь, что содержит индекс? Это наоборот? Это потому, что они делят все объекты, переданные для расширения.
Для того, чтобы это была переменная экземпляра, вам нужно создать экземпляр в конструкторе для Base и дать каждому подклассу этот конструктор из их соответствующих конструкторов. Как:
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.