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

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

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

class User extends Backbone.Model

отличается от

User = Backbone.Model.extend()

Ответ 1

Оба должны быть эквивалентными. Чтобы процитировать журнал изменений 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.

Ответ 2

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