Каковы основные отличия между использованием 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, затем используйте его... экономно.