2013-05-07 25 views
1

我试图沿着由布赖恩·曼制作的优秀教程backbonerails跟随。不幸的是(对我来说,因为我是一个noob)他正在使用咖啡标记。什么是混淆是我下面的代码的假设:与Backbone.js的使用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应该生产什么普通的假设,我是不正确的接近解释咖啡脚本的方式,或者是我超越希望?

回答

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的功能。