18

extendsCoffeeScriptとBackbone.jsの利用の基本的な違いは何extendですか?

たとえば、どうですか

class User extends Backbone.Model

と違う

User = Backbone.Model.extend()
4

2 に答える 2

22

この2つは同等であることが意図されています。Backbone.jsの変更ログを引用するには:

0.3.0:バックボーンクラスがCoffeeScriptクラスによってシームレスに継承されるようになりました。

CoffeeScriptChild extends ParentとBackboneはどちらも、次のChild = Parent.extend()3つの重要なことを行います。

  1. (最も重要)それらはに設定さChild.prototypeれますnew ctor。ここで、ctorはプロトタイプがである関数ですParent.prototype。これにより、プロトタイプの継承が確立されます。
  2. Parentのすべての静的プロパティをにコピーしChildます。
  3. 彼らは設定しChild.__super__ = Parentます。これは主に、のメソッドでCoffeeScriptのRubyのようなsuperキーワードをサポートするためです。Child
于 2012-11-06T03:46:51.657 に答える
2

いくつかの違いがあります。Backboneのメソッドを使用すると、CoffeeScriptのクラスの構文糖衣構文や静的プロパティ/メソッドextend()を失うことになります。super

Model = Backbone.Model.extend
  set: (attrs, options) ->
    super

これは(正しくない)にコンパイルされます...

var Model;
Model = Backbone.Model.extend({
  set: function(attrs, options) {
    return set.__super__.constructor.call(this, arguments);
  }
});

ただし、この方法でスーパーを使用できます。

Model = Bakbone.Model.extend()
Model::set = ->
  super

これは(正しい)にコンパイルされます...

var Model;
Model = Backbone.Model.extend();

Model.prototype.set = function() {
  return Model.__super__.set.apply(this, arguments);
};

Coffeescriptクラスの欠点は、コードの編成とコンパイルの方法によっては__extends()、コンパイルされたjavascriptのクラス定義の先頭にCoffeeScriptの関数が追加される可能性があります。何十回も複製されたこの余分なコードは、ファイルをかなり膨らませることができます。common.jsモジュールでコードをラップするフレームワークを使用している場合は特にそうです。

したがってextend()、無駄のないコンパイル済みコードには、デフォルトでBackboneを使用します。次に、coffeescriptクラスの構文を使用すると便利な特殊なケースがある場合は、先に進んでそれを使用してください...控えめに。

于 2013-01-29T20:29:30.907 に答える