extends
CoffeeScriptとBackbone.jsの利用の基本的な違いは何extend
ですか?
たとえば、どうですか
class User extends Backbone.Model
と違う
User = Backbone.Model.extend()
extends
CoffeeScriptとBackbone.jsの利用の基本的な違いは何extend
ですか?
たとえば、どうですか
class User extends Backbone.Model
と違う
User = Backbone.Model.extend()
この2つは同等であることが意図されています。Backbone.jsの変更ログを引用するには:
0.3.0:バックボーンクラスがCoffeeScriptクラスによってシームレスに継承されるようになりました。
CoffeeScriptChild extends Parent
とBackboneはどちらも、次のChild = Parent.extend()
3つの重要なことを行います。
Child.prototype
れますnew ctor
。ここで、ctor
はプロトタイプがである関数ですParent.prototype
。これにより、プロトタイプの継承が確立されます。Parent
のすべての静的プロパティをにコピーしChild
ます。Child.__super__ = Parent
ます。これは主に、のメソッドでCoffeeScriptのRubyのようなsuper
キーワードをサポートするためです。Child
いくつかの違いがあります。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クラスの構文を使用すると便利な特殊なケースがある場合は、先に進んでそれを使用してください...控えめに。