Это вызвано оценкой литералов объекта в JavaScript. Эта строка:
items:['foo'],
вычисляет массив немедленно, и все родительские типы / подтипы содержат ссылку на один и тот же объект.
Все объекты Backbone расширены литералом объекта, чтобы создать новый тип. Объектные литералы являются парами ключ: значение, где ключ всегда является буквальным ключом, и значение оценивается, как только синтаксический анализатор JavaScript достигает этой строки. Из-за этого вы получаете единственную ссылку на массив ['foo']
в родительском классе. Объекты являются ссылками в JavaScript, и каждый из ваших подклассов будет содержать ссылку на один и тот же массив.
Самый простой способ исправить это - назначить items
для функции, которая возвращает массив (что не кажется хорошим вариантом в вашем случае), или назначить массив в конструкторе родительского класса (или метод инициализации, если хотите):
Backbone.View.extend({
constructor: function(){
Backbone.View.prototype.constructor.apply(this, arguments);
this.items = ['foo'];
}
});
Подробное обсуждение литералов и значений объектов (в контексте jQuery, но здесь применяются те же принципы) см. В моем блоге здесь: http://lostechies.com/derickbailey/2011/11/09/backbone-js-object-literals-views-events-jquery-and-el/