Фундаментальные различия между использованием CoffeeScript «extends» и Backbone.js «extend»

Каковы принципиальные различия между использованием CoffeeScript extends и Backbone.js extend?

Например, как

class User extends Backbone.Model

отличный от

User = Backbone.Model.extend()

person rudolph9    schedule 06.11.2012    source источник


Ответы (2)


Эти два должны быть эквивалентны. Чтобы процитировать журнал изменений Backbone.js:

0.3.0: классы Backbone теперь могут легко наследоваться классами CoffeeScript.

И Child extends Parent в CoffeeScript, и Child = Parent.extend() в Backbone делают три важные вещи:

  1. (Самое важное) Они устанавливают Child.prototype на new ctor, где ctor — это функция, прототипом которой является Parent.prototype. Это устанавливает прототипное наследование.
  2. Они копируют все статические свойства Parent в Child.
  3. Они установили Child.__super__ = Parent. В основном это сделано для поддержки Ruby-подобного ключевого слова CoffeeScript super в методах Child.
person Trevor Burnham    schedule 06.11.2012

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

person Jeremy Fowler    schedule 29.01.2013
comment
CoffeeScript оптимизирует код при его компиляции, хотя в результирующем файле может быть немного больше символов, не будет ли использование CoffeeScript class выполняться более эффективно? - person rudolph9; 31.01.2013