【问题标题】:In coffee-script whats the differences between these two ways of creating backbone models, views etc在咖啡脚本中,这两种创建主干模型、视图等的方式有什么区别
【发布时间】:2012-07-03 08:20:18
【问题描述】:

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

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 中创建模型的方式?

【问题讨论】:

    标签: backbone.js coffeescript


    【解决方案1】:

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

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

    您看到CoffeeScript extends 无处不在的唯一原因是因为您正在查看CoffeeScript 示例。老实说,就是这样。以一种或另一种方式做这件事没有任何好处。只是 CoffeeScript 说你应该使用 extends 关键字,所以人们会这样做。

    【讨论】:

      【解决方案2】:

      我没有使用 Backbone 的经验,但我认为 Backbone.Model.extend 的存在只是为了避免 CoffeeScript 编译成的冗长和复杂的东西。但是由于 CoffeeScript 提供了一个“extends”关键字,所以您可以使用一种漂亮而干净的 OOP 方式,并且仍然可以得到可读的代码。

      【讨论】:

      • 那么,当 Backbone 对象具有内置的扩展功能时,为什么它仍然可以使用更好的 OOP-ish 方式工作呢?我发现很难理解..这两种方式有很大区别吗?
      • 不,差异似乎并不明显。事实上,Backbone 的 extend 方法会做几乎相同的事情,所以它只是对你隐藏了一堆代码——就像 CoffeeScript 所做的那样。但是由于 Backbone 是开源的,你可以去看看 Model.extend() 到底做了什么:github.com/documentcloud/backbone/blob/master/backbone.js
      猜你喜欢
      • 2021-04-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-16
      • 1970-01-01
      相关资源
      最近更新 更多