Фундаментални разлики между използването на 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: Основните класове вече могат безпроблемно да се наследяват от класовете на 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 ключова дума super на CoffeeScript в методите на Child.
person Trevor Burnham    schedule 06.11.2012

Има някои разлики. Ако използвате метода extend() на Backbone, губите от синтактичната захар на класа на 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 е, че в зависимост от това как организирате и компилирате кода си, всеки клас може да има функцията __extends() на CoffeeScript, добавена към горната част на дефиницията на класа в компилирания javascript. Този допълнителен код, дублиран десетки пъти, може значително да увеличи вашите файлове. Особено вярно, ако използвате рамка, която обгръща вашия код в модули common.js.

Така че бих използвал extend() на Backbone по подразбиране за постно компилиран код. След това, когато имате специален случай, в който би било добре да използвате синтаксиса на класа на coffeescript, продължете и го използвайте... пестеливо.

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