extends
使用 CoffeeScript与 Backbone.js的根本区别是什么extend
?
例如,如何
class User extends Backbone.Model
不同于
User = Backbone.Model.extend()
extends
使用 CoffeeScript与 Backbone.js的根本区别是什么extend
?
例如,如何
class User extends Backbone.Model
不同于
User = Backbone.Model.extend()
两者旨在等效。引用 Backbone.js 更改日志:
0.3.0:Backbone 类现在可以被 CoffeeScript 类无缝继承。
CoffeeScriptChild extends Parent
和 BackboneChild = Parent.extend()
都做了三件重要的事情:
Child.prototype
为new ctor
,其中ctor
是原型为 的函数Parent.prototype
。这建立了原型继承。Parent
的静态属性复制到Child
.Child.__super__ = Parent
。这主要是为了在's 方法中支持 CoffeeScript 的 Ruby-likesuper
关键字。Child
有一些差异。如果你使用 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 类语法的特殊情况时,请继续使用它...谨慎使用。