2012-11-06 15 views

答えて

22

2から等価であることが意図されている

class User extends Backbone.Model 

異なっています。 Backbone.jsの変更履歴を引用するには:

0.3.0:Backboneクラスは、CoffeeScriptクラスによって継ぎ目なく継承されるようになりました。

両方のCoffeeScriptのChild extends ParentとバックボーンのChild = Parent.extend()三つの重要な事柄を実行します。

  1. (最も)彼らはctorプロトタイプParent.prototypeある機能ですnew ctorChild.prototypeを設定します。それはプロトタイプの継承を確立する。
  2. Parentのすべての静的特性をChildにコピーします。
  3. Child.__super__ = Parentを設定します。これは、主にChildのメソッドでCoffeeScriptのRubyのようなsuperキーワードをサポートするためです。
2

いくつかの違いがあります。バックボーンのextend()メソッドを使用すると、superや静的なプロパティ/メソッドのようなCoffeeScriptのクラス構文的な砂糖がなくなります。 (間違った)にコンパイル

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クラスの欠点、dependiどのようにコードを整理してコンパイルするかについては、コンパイルされたjavascriptのクラス定義の先頭にCoffeeScriptの__extends()関数を追加することができます。何十回も複製されたこの余分なコードは、あなたのファイルを大幅に膨張させることができます。 common.jsモジュールでコードをラップするフレームワークを使用している場合は特に当てはまります。

したがって、私はバックボーンのextend()を、デフォルトでは、コンパイルされたコードのために使用します。次に、coffeescriptクラスの構文を使用するのが良い特別なケースがある場合は、先に進んで使用してください。控えめに

+1

CoffeeScriptは、コンパイル時にコードを最適化しますが、結果のファイルはCoffeeScriptを使用しないで少し文字数が多いかもしれませんが、 'class'は一般的に効率的に実行されますか? – rudolph9

関連する問題