Краткий ответ
Когда вы вызываете extends
, чтобы определить свой объект, вы передаете конфигурацию нового объекта как литерал объекта.Объекты передаются по ссылке, а функция extends
передает только ссылку на массив тегов в определение нового типа.
Как отмечали другие, вы можете исправить это, назначив tags
функции,Это работает, потому что функция задерживает оценку tags
, пока объект не будет создан.Нет ничего нативного в JavaScript, который делает это, но сам Backbone распознает tags
как функцию или значение.
Длинный ответ
Несмотря на то, что ваш код в CoffeeScript, этотсводится к комбинации нескольких вещей в JavaScript:
- В JavaScript нет классов
- Литералы объекта вычисляются немедленно
- Объекты JavaScript передаютсяссылка
В JavaScript нет классов.Период.CoffeeScript дает вам представление о классе, но в действительности он компилируется в JavaScript, который не имеет классов.
Вы можете иметь типы и определения типов (функции конструктора), но не классы.Backbone предоставляет определение, подобное классу, которое похоже на «расширенное» наследование Java на основе классов.Тем не менее, это всего лишь JavaScript, который не имеет классов.
Вместо этого мы имеем объектный литерал, передаваемый методу extends
.Это как если бы вы написали этот код:
var config = {
tags: []
}</p>
<p>var MyModel = Backbone.Model.extends(config);
В этом коде config
является литералом объекта, или хэшем, или парой ключ / значение, или ассоциативным массивом.,Какое бы имя вы ни называли, это одна и та же основная идея.В итоге вы получите объект config
с атрибутом tags
.Значение config.tags
представляет собой пустой массив, []
, который сам является объектом.
, что возвращает нас к короткому ответу:
Когда вы вызываете extends
, чтобы определитьваш объект, вы передаете конфигурацию нового объекта как литерал объекта.Объекты передаются по ссылке, а функция extends
передает только ссылку на массив тегов в определение нового типа.
Как отмечали другие, вы можете исправить это, назначив tags
функции,Это работает, потому что функция задерживает оценку tags
, пока объект не будет создан.Нет ничего нативного в JavaScript, который делает это, но сам Backbone распознает tags
как функцию или значение.