Backbone.js 在coffee脚本中,这两种创建主干模型、视图等的方法有什么区别

Backbone.js 在coffee脚本中,这两种创建主干模型、视图等的方法有什么区别,backbone.js,coffeescript,Backbone.js,Coffeescript,我目前正在研究coffee脚本,因为它的语法比纯javascript更伟大,更容易编写/理解。但是,我发现使用主干和coffee脚本的教程显示,创建模型的方法如下所示: class User extends Backbone.Model initialize: -> alert 'start' 这看起来很好,但是当使用扩展时,它编译起来相当奇怪。。。我知道这是coffee脚本让类在javascript中工作的方式 (function() { var User, _

我目前正在研究coffee脚本,因为它的语法比纯javascript更伟大,更容易编写/理解。但是,我发现使用主干和coffee脚本的教程显示,创建模型的方法如下所示:

class User extends Backbone.Model
  initialize: ->
    alert 'start'
这看起来很好,但是当使用
扩展时,它编译起来相当奇怪。。。我知道这是coffee脚本让类在javascript中工作的方式

(function() {
  var User,
    __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; };

    User = (function(_super) {

    __extends(User, _super);

    function User() {
      return User.__super__.constructor.apply(this, arguments);
    }

    User.prototype.initialize = function() {
      return alert('start');
    };

    return User;

  })(Backbone.Model);

}).call(this);
但如果您使用:

User = Backbone.Model.extend
    initialize: ->
        alert 'start'
这会编译得更好(更像我编写它的方式):


有人能给我解释一下创建模型类的不同方法吗?为什么第一种方法在教程中使用得更多,而第二种方法的编译方式更像我用纯javascript创建模型的方式?

我没有主干网方面的经验,但我认为,
Backbone.Model.extend
的存在只是为了避免像CoffeeScript编译成这样冗长复杂的东西。但是,由于CoffeeScript提供了一个“extends”关键字,因此您可以使用一种简洁明了的面向对象方法,最终仍然可以得到可读的代码。

这两种方法在功能上是等效的,在工作方式上没有显著差异。当然,在实现上存在一些差异,但最终结果是相同的

真正的区别,以及为什么您看到coffeescript
extends
关键字生成的代码更大,是当您调用
Backbone.Model.extend
时,您调用的是coffeescript生成的相同代码的Backbone版本。它被封装在主干网的
extend
方法中,但在工作方式和原因上基本相似


看到CoffeeScript
extends
随处可见的唯一原因是,您看到的是CoffeeScript示例。老实说,就是这样。这样那样做没有好处。只是CoffeeScript说你应该使用
extends
关键字,这样人们就可以这样做。

那么,当主干对象内置了extend函数时,为什么它仍然使用更好的面向对象方式呢?我发现很难理解。。这两种方法有很大的区别吗?不,区别似乎不明显。事实上,主干网的extend方法将做几乎相同的事情,所以它只是对您隐藏了一堆代码——就像CoffeeScript一样。但由于主干网是开源的,您可以去检查Model.extend()的具体功能:
(function() {
  var User;

  User = Backbone.Model.extend({
    initialize: function() {
      return alert('start');
    }
  });

}).call(this);