3

私は現在、純粋な JavaScript よりも構文が優れており、記述/理解が容易であるため、coffee-script を検討しています。しかし、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);

モデルクラスを作成する方法の違いと、2番目の方法が純粋なjavascriptでモデルを作成する方法のようにコンパイルされるときに、最初の方法がチュートリアルでより頻繁に使用される理由を誰かに説明できますか?

4

2 に答える 2

4

これら 2 つの方法は機能的に同等であり、動作方法に大きな違いはありません。確かに、いくつかの実装の違いがありますが、最終的な結果は同じです。

本当の違い、そしてなぜ coffeescriptextendsキーワードからより大きなコード生成が見られるのかというとBackbone.Model.extend、 を呼び出すときに、CoffeeScript が生成する同じコードの Backbone のバージョンを呼び出しているからです。Backbone のextendメソッド内にカプセル化されていますが、その仕組みと理由はほぼ同じです。

extendsCoffeeScriptがどこでも使用されている唯一の理由は、 CoffeeScript の例を見ているからです。正直、それだけです。どちらか一方の方法で行うメリットはありません。CoffeeScript がextendsキーワードを使用する必要があると言っているだけなので、人々はそのように使用します。

于 2012-07-02T23:25:00.567 に答える
1

Backbone.Model.extend私は Backbone の経験はありませんが、CoffeeScript がコンパイルされるような長くて複雑なものを避けるためだけに存在すると思います。しかし、CoffeeScript には "extends" キーワードが用意されているため、OOP 風の適切でクリーンな方法を使用しても、コードを読みやすくすることができます。

于 2012-07-02T22:31:58.290 に答える