1

我正在尝试遵循 Brian Mann 制作的优秀教程主干道。不幸的是(对我来说,因为我是菜鸟)他正在使用咖啡脚本。令人困惑的是我对以下代码的假设:

class App.Views.Users extends Backbone.View

我相信相当于:

Users = Backbone.View.extend({});

在普通的 javascript 中。但是,当我将咖啡脚本代码放在 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 应该产生什么的假设是错误的,我是在错误地接近解释咖啡脚本的方式,还是我超出了希望?

4

1 回答 1

4

coffeescript 中的类不能保证它们扩展的类有一个方法,所以如果没有明确要求它所使用的所有类提供方法,extendcoffeescript 就不可能编译为。Backbone.View.extendextend

但是,如果您查看_.extend(Backbone 使用)的源代码,您会发现它与__extendscoffeescript 生成和使用的方法非常相似。

coffeescript 编译的版本显然更冗长,但实际上我从来没有注意到和之间的区别class MyView extends Backbone.ViewMyView = Backbone.View.extends({}};所以你可以使用你喜欢的任何一个。

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

于 2013-05-07T17:29:10.450 回答