我正在尝试遵循Brian Mann制作的优秀教程骨干。不幸的是(对我而言,因为我是一个菜鸟)他正在使用coffeescript。令人困惑的是我对以下代码的假设:
class App.Views.Users extends Backbone.View
我认为相当于:
Users = Backbone.View.extend({});
在普通的javascript中。但是,当我将coffeescript代码放入trycoffeescript时,我得到:
var _ref,
__hasProp = {}.hasOwnProperty,
__extends = function(child, parent) { for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; };
App.Views.Users = (function(_super) {
__extends(Users, _super);
function Users() {
_ref = Users.__super__.constructor.apply(this, arguments);
return _ref;
}
return Users;
})(Backbone.View);
我的问题是我错误地认为普通的javascript应该产生什么,我是否错误地接近解释咖啡脚本的方式,或者我是否超出希望?
答案 0 :(得分:4)
coffeescript中的类不能保证他们扩展的类具有extend
方法,因此coffeescript无法编译为Backbone.View.extend
,而没有特别要求所有它用于提供extend
方法的类。
但是,如果你看一下_.extend(Backbone使用的)的来源,你会发现它与coffeescript生成和使用的__extends
方法非常相似。
coffeescript编译的版本显然更加冗长,但实际上我从未注意到class MyView extends Backbone.View
和MyView = Backbone.View.extends({}};
之间存在差异,因此您可以使用您喜欢的任何一种。
编辑:一个可能的区别实际上是super
coffeescript关键字,只有在你使用coffeescript类时它才有效。但是,通过直接调用超类函数,您仍然可以使用.extends
复制该功能。