Каковы основные отличия между использованием CoffeeScript extends и Backbone.js extend?
Например, как
class User extends Backbone.Model
отличается от
User = Backbone.Model.extend()
Каковы основные отличия между использованием CoffeeScript extends и Backbone.js extend?
Например, как
class User extends Backbone.Model
отличается от
User = Backbone.Model.extend()
Оба должны быть эквивалентными. Чтобы процитировать журнал изменений Backbone.js:
0.3.0: теперь классы магии могут быть полностью унаследованы классами CoffeeScript.
Оба CoffeeScript Child extends Parent и Backbone Child = Parent.extend() выполняют три важные вещи:
Child.prototype в new ctor, где ctor - это функция, прототипом которой является Parent.prototype. Это устанавливает прототипное наследование.Parent на Child.Child.__super__ = Parent. Это главным образом для поддержки ключевого слова super для CoffeeScript Ruby-like в Child.Есть некоторые отличия. Если вы используете метод Backbone extend(), вы теряете синтаксический сахар класса CoffeeScript, например super и статические свойства/методы.
Model = Backbone.Model.extend
set: (attrs, options) ->
super
который компилируется (неверно)...
var Model;
Model = Backbone.Model.extend({
set: function(attrs, options) {
return set.__super__.constructor.call(this, arguments);
}
});
Вы можете использовать супер так:
Model = Bakbone.Model.extend()
Model::set = ->
super
который компилируется (исправляет)...
var Model;
Model = Backbone.Model.extend();
Model.prototype.set = function() {
return Model.__super__.set.apply(this, arguments);
};
Недостаток классов coffeescript, в зависимости от того, как вы организуете и компилируете свой код, каждый класс может иметь функцию CoffeeScript __extends(), добавленную к вершине определения класса в скомпилированном javascript. Этот лишний бит кода, дублированный десятками раз, может значительно увеличить ваши файлы. Особенно верно, если вы используете фреймворк, который обертывает ваш код в модули common.js.
Таким образом, я бы использовал Backbone extend() по умолчанию для постного скомпилированного кода. Затем, когда у вас есть специальный случай, который будет хорошо использовать синтаксис класса coffeescript, затем используйте его... экономно.