簡體   English   中英

利用CoffeeScript`extens`與Backbone.js`extens`之間的基本區別

[英]Fundamental differences between utilizing CoffeeScript `extends` vs. Backbone.js `extend`

使用CoffeeScript extends與Backbone.js extend之間的根本區別是什么?

例如,怎么樣

class User extends Backbone.Model

不同於

User = Backbone.Model.extend()

這兩者是相同的。 引用Backbone.js更改日志:

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

CoffeeScript的Child extends Parent和Backbone的Child = Parent.extend()做了三件重要的事情:

  1. (最重要的)他們將Child.prototype設置為new ctor ,其中ctor是一個原型為Parent.prototype的函數。 這確立了原型繼承。
  2. 它們將Parent的所有靜態屬性復制到Child
  3. 他們設置Child.__super__ = Parent 這主要是為了在Child的方法中支持CoffeeScript的Ruby類super關鍵字。

有一些差異。 如果你使用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類語法會很好,然后繼續使用它...... 謹慎

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM