利用CoffeeScript`extens`与Backbone.js`extens`之间的基本区别

时间:2012-11-06 02:58:19

标签: inheritance backbone.js coffeescript

使用CoffeeScript extends与Backbone.js extend之间的根本区别是什么?

例如,如何

class User extends Backbone.Model

不同
User = Backbone.Model.extend()

2 个答案:

答案 0 :(得分:22)

两者旨在相同。引用Backbone.js更改日志:

  

0.3.0:CoffeeScript类现在可以无缝地继承骨干类。

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

  1. (最重要)他们将Child.prototype设置为new ctor,其中ctor是一个原型为Parent.prototype的函数。这确立了原型继承。
  2. 他们将Parent的所有静态属性复制到Child
  3. 他们设置Child.__super__ = Parent。这主要是为了支持CoffeeScript在super方法中类似Ruby的Child关键字。

答案 1 :(得分: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);
  }
});

你可以这样使用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类语法会很好,然后继续使用它...... 谨慎