3

我目前正在研究咖啡脚本,因为它的语法比纯 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 中创建模型的方式?

4

2 回答 2

4

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

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

The only reason you see the CoffeeScript extends used everywhere, is because you're looking at CoffeeScript examples. Honestly, that's it. There's no benefit to doing it one way or the other. It's just that CoffeeScript says you should use the extends keyword so people do it that way.

于 2012-07-02T23:25:00.567 回答
1

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

于 2012-07-02T22:31:58.290 回答