在咖啡脚本中,这两种创建骨干模型,视图等的方式之间存在差异

时间:2012-07-02 22:04:48

标签: backbone.js coffeescript

我目前正在研究咖啡脚本,因为语法比纯javascript更容易编写/理解。但是我发现使用backbone和coffee-script的教程表明创建模型的方法如下:

class User extends Backbone.Model
  initialize: ->
    alert 'start'

这看起来很不错,但是当使用extends时,它编译起来相当奇怪...我理解这是咖啡脚本使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'

编译得更好(更像是我写的方式):

(function() {
  var User;

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

}).call(this);

任何人都可以向我解释创建模型类的方式的差异,以及为什么第一个方法在教程中更频繁地使用,而第二个方法编译更像是如何在纯javascript中创建模型?

2 个答案:

答案 0 :(得分:4)

这两种方法在功能上是等效的,它们的工作方式没有显着差异。确实存在一些实现差异,但最终结果是一样的。

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

您看到CoffeeScript extends无处不在的唯一原因是因为您正在查看CoffeeScript示例。老实说,就是这样。这样或那样做是没有好处的。这就是CoffeeScript说你应该使用extends关键字,以便人们这样做。

答案 1 :(得分:1)

我没有使用Backbone的经验,但我认为只有Backbone.Model.extend才能避免像CoffeeScript编写的那样冗长复杂的东西。但是,由于CoffeeScript提供了“extends”关键字,因此您可以采用一种漂亮而干净的OOP方式,并最终获得可读代码。

相关问题