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.