2011-12-27 12 views
4

人々は多くの点でBackbone.Viewを使用しています。私は混乱しています。私が見てきた:Backbone.Viewの理解

Backbone.View.extend({}); 
new Backbone.View.extend({}); 
new Backbone.View(); 
new Backbone.View; 

は、最初の3つは異なるです。最後の2つは同じです。 (フィドルについては、hereを参照してください。)どの場合に起こっていますか?

答えて

2

これはすべて同じことです。

Backbone.View.extend({})を使用してクラスを強制終了すると、表示されているように、追加のプロパティまたはメソッドがクラスに追加されていません。空のハッシュ{}を引数として渡しています。だから、Backbone.ViewBackbone.View.extend({})はほとんど同じことです。

キーワードプレゼンスについては、以前は新しいクラスをインスタンス化しています。 newキーワードを使用しないと、クラスについて話しているだけですが、newキーワードでは、この非常に同じクラスのオブジェクトについて話しています。

育児は義務ではありません。これは、コンストラクタに引数を渡したい場合にのみ必要です。new Backbone.View()new Backbone.View;は、前に書いた理由でnew Backbone.View()new Backbone.View.extend({})のように同じです。このフィドル(http://jsfiddle.net/C2Z34/)について

  • myView1ビューを拡張するクラスです
  • myView2は(私のバイオリンのようにparentesisで)の対象でありますBackbone.Viewのクラス拡張。
  • myView3は、Backbone.Viewクラスのオブジェクトです。それは拡張されていません。
  • myView4拡張myView3
+0

'Backbone.View'と' Backbone.View.extend() 'は* different *です。 [このフィドル](http://jsfiddle.net/C2Z34/1/)をご覧ください。 – Randomblue

+1

(Fiddleのサンプルを実行できないため、Chromeコンソールを使用しました) @ gustavotkgはまだ正しいです。 コンソールは、最初の3つが異なることを伝えます。しかし、 'Backbone.View'と' Backbone.View.extend() 'は似ています。 'new backbone.View'と' new(Backbone.View.extend()) 'を使うと、' Backbone.View.extend() 'が返す関数を迂回しても、Viewコンストラクタを呼び出して同様のオブジェクトを返します。[継承、ライン1096]。 'new Backbone.View.extend()'は、括弧がないことに注意してください。多かれ少なかれJSWTFです。私は 'new(Backbone.View.extend()) 'を呼び出すと期待していますが、そうではありません。 – Wieczo

+0

@wieczo:ありがとう。角括弧についてのあなたのコメントは非常に役に立ちます。私はそれについて混乱していた。 – Randomblue

-1

同じサブクラスを作成します。例では、カスタム・コードを追加しないため、ビュー・クラスは元のバックボーン・ビューとまったく同じように動作します。 newキーワードを使用すると、ビューのインスタンスを返すクラスのコンストラクタ関数を呼び出します。 例えば、カスタムコードをビューに表示したい場合は、レンダー機能でBBビューを拡張します。このビューを使用する場合は、拡張ビューの新しいインスタンスを作成します。

+0

私は混乱しています。 'new Backbone.View.extend({});はインスタンスを返しません。関数を返します。 – Randomblue

+0

これは、このステートメントがメソッド呼び出しの順序を混乱させる可能性があるためです。拡張クラスのインスタンスを1つしか作成できないため、この結合ステートメントはほとんど必要ありません。呼び出し:new(Backbone.View.extend({}))は期待どおりに動作するはずです。 – ProTom

+0

メソッド呼び出しの前に新しい文が追加されました。例: "new hello();"関数呼び出しは実行されませんが、このメソッドはnewを介して作成された新しいオブジェクトのコンストラクタ関数として使用されます。したがって、あなたの拡張関数は完全に新しいオブジェクトのコンストラクタ関数として使用されます。 JS関数はオブジェクト(したがってクラス)であるため、newを呼び出すことでJSの新しいインスタンスが作成されるため、これはJSWTFではありません。 – ProTom