使用coffeescript与backbone.js问题

时间:2013-05-07 17:19:42

标签: backbone.js coffeescript

我正在尝试遵循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应该产生什么,我是否错误地接近解释咖啡脚本的方式,或者我是否超出希望?

1 个答案:

答案 0 :(得分:4)

coffeescript中的类不能保证他们扩展的类具有extend方法,因此coffeescript无法编译为Backbone.View.extend,而没有特别要求所有它用于提供extend方法的类。

但是,如果你看一下_.extend(Backbone使用的)的来源,你会发现它与coffeescript生成和使用的__extends方法非常相似。

coffeescript编译的版本显然更加冗长,但实际上我从未注意到class MyView extends Backbone.ViewMyView = Backbone.View.extends({}};之间存在差异,因此您可以使用您喜欢的任何一种。

编辑:一个可能的区别实际上是super coffeescript关键字,只有在你使用coffeescript类时它才有效。但是,通过直接调用超类函数,您仍然可以使用.extends复制该功能。