使用CoffeeScript extends
与Backbone.js extend
之间的根本区别是什么?
例如,如何
class User extends Backbone.Model
与
不同User = Backbone.Model.extend()
答案 0 :(得分:22)
两者旨在相同。引用Backbone.js更改日志:
0.3.0:CoffeeScript类现在可以无缝地继承骨干类。
CoffeeScript的Child extends Parent
和Backbone的Child = Parent.extend()
都做了三件重要的事情:
Child.prototype
设置为new ctor
,其中ctor
是一个原型为Parent.prototype
的函数。这确立了原型继承。Parent
的所有静态属性复制到Child
。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类语法会很好,然后继续使用它...... 谨慎。