2012-11-06 58 views

回答

22

兩個旨在是等價的。引用Backbone.js更新日誌:

0.3.0:Backbone類現在可以通過CoffeeScript類無縫地繼承。

兩個CoffeeScript中的Child extends Parent和骨幹Child = Parent.extend()做三個重要的事情:

  1. (最重要的)他們設置Child.prototypenew ctor,其中ctor是一個函數,其原型是Parent.prototype。這確立了原型繼承。
  2. 他們複製了Parent的所有靜態屬性到Child
  3. 他們設置Child.__super__ = Parent。這主要是爲了在Child的方法中支持CoffeeScript的類似Ruby的super關鍵字。
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類的缺點依賴在組織和編譯代碼的方式上,每個類可以在編譯後的JavaScript中將CoffeeScript的__extends()函數附加到類定義的頂部。這種重複數十倍的代碼可以大大增加您的文件。尤其如果使用一個將你的代碼包裝在common.js模塊中的框架,

所以我會使用Backbone的extend()默認爲精益編譯的代碼。然後,當你有一個特殊的情況,這將是很好的使用coffeescript類語法,然後繼續使用它... 節省

+1

CoffeeScript在編譯代碼時優化了代碼,雖然生成的文件可能稍多些字符不會使用CoffeeScript'class'通常會更高效地執行? – rudolph9

相關問題