2

私は研究プロジェクトを引き継いでおり、かなりうまくやっていますが、最近、Backbone に実装されている JS 構造を誤解していると思います。モデルまたはコレクションの構造と、オブジェクトまたは関数のどちらを返すかについて混乱しています。

プロジェクトのモデルの現在の構造は次のとおりです。

define([…], function(…) {
  var measureModel = Backbone.Model.extend({
    defaults: {…},
    initialize: function(){…}
    …
  });
  return measureModel; //here there is no function, so I assume its an object
});

コレクションの場合:

define([…], function(…){
  var measuresCollection = Backbone.Collection.extend({
    model: measureModel,
    initialize: function(){…}
  });
  return new measuresCollection(); //here I assume it is an function
});

上記の構造で新しいモデルとコレクションを作成しましたが、以下のエラーが発生したため、これも試しました:

define([…], function(…){
  return Backbone.Collection.extend({  // here I just return the Object
    model: newerModel,
    initialize: function(){…}
  });
});

この最初の構造に従って、いくつかの新しいモデルとコレクションで、最後の return ステートメントの省略に応じて、またはオブジェクトを完全に返すだけで、エラーUncaught TypeError: object is not a functionまたはUncaught TypeError: [Object object] is not a functionまたはが発生します。Uncaught TypeError: undefined is not a function

次のように、別のビューでコンストラクターを呼び出しています。this.newerCollection = new NewerCollection();

  • 同じ構造を使用してこれらのエラーが発生するのはなぜですか?
  • 変数を作成して返すことと、そのまま返すことの違いは何ですか?
  • なぜ私はある方法を別の方法で使用するのでしょうか?
4

1 に答える 1

4

extend拡張したモデル/コレクション/ビューのコンストラクターとして使用される関数を常に返します。

このコード ブロック (問題の最初のコード ブロック) では、拡張モデルのコンストラクターである関数を返しています。

define([…], function(…) {
  var measureModel = Backbone.Model.extend({
    defaults: {…},
    initialize: function(){…}
    …
  });
  return measureModel; //here you are returning a function, which is a constructor for the extended Model
});

このコード ブロック (質問の 2 つ目) では、measuresCollectionusing をインスタンス化したため、関数ではなくオブジェクトを返していますnewmeasuresCollection変数自体がコンストラクターです。

define([…], function(…){
  var measuresCollection = Backbone.Collection.extend({
    model: measureModel,
    initialize: function(){…}
  });
  return new measuresCollection(); //here you are returning an object because it is instantiated using `new`
});

そのモジュールの値を使用して新しいオブジェクトをインスタンス化しようとすると、「オブジェクトは関数ではありません」というエラーが発生します。

このコード ブロック (問題の 3 番目のブロック)では、2 番目のブロックのreturningと同等measuresCollectionです。そこでは、最初のブロックと同じように、オブジェクトではなく関数を返しています。

define([…], function(…){
  return Backbone.Collection.extend({  // this is returning a function, the same as the first code block
    model: newerModel,
    initialize: function(){…}
  });
});

returnモジュールからステートメントを省略すると、それundefinedを使用してオブジェクトをインスタンス化しようとすると、戻り、「未定義は関数ではありません」というエラーが発生します。

1 番目と 3 番目のコード ブロックでコンストラクターを返す方法に本質的な違いはありません。前者は、コンストラクターをローカル変数に代入してから返すだけです。これを行う唯一の理由は、返す前に操作する必要がある場合です。

于 2013-07-09T19:54:52.380 に答える