Каковы принципиальные различия между использованием 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: классы Backbone теперь могут легко наследоваться классами CoffeeScript.
И Child extends Parent
в CoffeeScript, и Child = Parent.extend()
в Backbone делают три важные вещи:
Child.prototype
на new ctor
, где ctor
— это функция, прототипом которой является Parent.prototype
. Это устанавливает прототипное наследование.Parent
в Child
.Child.__super__ = Parent
. В основном это сделано для поддержки Ruby-подобного ключевого слова CoffeeScript super
в методах 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);
}
});
Вы можете использовать super таким образом:
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, тогда используйте его... экономно.
class
выполняться более эффективно?
- person rudolph9; 31.01.2013