2012-11-06 15 views

risposta

22

I due sono destinati ad essere equivalenti. Per citare il registro delle modifiche di Backbone.js:

0.3.0: Le classi Backbone possono ora essere ereditate senza problemi dalle classi CoffeeScript.

Entrambi di Child extends Parent CoffeeScript e la spina dorsale di Child = Parent.extend() fare tre cose importanti:

  1. (cosa più importante) si misero a Child.prototypenew ctor, dove ctor è una funzione il cui prototipo è Parent.prototype. Ciò stabilisce l'eredità prototipale.
  2. Copiano tutte le proprietà statiche di Parent su Child.
  3. Impostano Child.__super__ = Parent. Si tratta principalmente di supportare la parola chiave Ruby-like super di CoffeeScript nei metodi Child.
2

Ci sono alcune differenze. Se utilizzi il metodo extend() di Backbone, perdi lo zucchero sintattico della classe CoffeeScript come super e le proprietà/metodi statici.

Model = Backbone.Model.extend 
    set: (attrs, options) -> 
    super 

che compila a (non corretta) ...

var Model; 
Model = Backbone.Model.extend({ 
    set: function(attrs, options) { 
    return set.__super__.constructor.call(this, arguments); 
    } 
}); 

È possibile utilizzare eccellente in questo modo però:

Model = Bakbone.Model.extend() 
Model::set = -> 
    super 

che compila al (corretto) ...

var Model; 
Model = Backbone.Model.extend(); 

Model.prototype.set = function() { 
    return Model.__super__.set.apply(this, arguments); 
}; 

Lo svantaggio delle classi coffeescript, dipende su come organizzi e compili il tuo codice, ogni classe potrebbe avere la funzione __extends() di CoffeeScript aggiunta alla parte superiore della definizione della classe nel javascript compilato. Questo extra bit di codice duplicato decine di volte può considerevolmente gonfiare i tuoi file. Particolarmente vero se si utilizza un framework che avvolge il codice nei moduli common.js.

Quindi, per impostazione predefinita utilizzare il dorsale extend() di Backbone per codice compilato snello. Quindi, quando hai un caso speciale che sarebbe bello usare la sintassi della classe coffeescript, allora vai avanti e usalo ... con parsimonia.

+1

CoffeeScript ottimizza il codice quando lo compila, anche se il file risultante potrebbe essere leggermente più caratteri che non userebbe la classe Class di CoffeeScript generalmente eseguita in modo più efficiente? – rudolph9

Problemi correlati