18

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

例如,如何

class User extends Backbone.Model

不同于

User = Backbone.Model.extend()
4

2 回答 2

22

两者旨在等效。引用 Backbone.js 更改日志:

0.3.0:Backbone 类现在可以被 CoffeeScript 类无缝继承。

CoffeeScriptChild extends Parent和 BackboneChild = Parent.extend()都做了三件重要的事情:

  1. (最重要的)他们设置Child.prototypenew ctor,其中ctor是原型为 的函数Parent.prototype。这建立了原型继承。
  2. 他们将所有Parent的静态属性复制到Child.
  3. 他们设置Child.__super__ = Parent。这主要是为了在's 方法中支持 CoffeeScript 的 Ruby-likesuper关键字。Child
于 2012-11-06T03:46:51.657 回答
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 模块中的框架,则尤其如此。

所以我会extend()默认使用 Backbone 的精益编译代码。然后,当您有一个可以很好地使用coffeescript 类语法的特殊情况时,请继续使用它...谨慎使用

于 2013-01-29T20:29:30.907 回答