0

次のようなバックボーン モデルのコレクションがあります。

window.Message = Backbone.Model.extend({});

window.MessageCollect = Backbone.Collection.extend({ model: Message, url: '/messages'});

create() を呼び出すために新しいコレクションをインスタンス化する必要があるのはなぜですか? MessageCollect で create() を呼び出すと、no method エラーが発生します。

window.Messages = new MessageCollect;

function makeMessage(){ Messages.create({title:'first message', sender:user_name}); }
//ok

function makeMessageTwo(){ MessageCollect.create({title:'first message', sender:user_name}); }
//Object function (){ parent.apply(this, arguments); } has no method 'create' 
4

2 に答える 2

2

Backbone.Collection - はインスタンスではなくクラスであるためです。基本クラスを拡張する Backbone.Collection.extend を呼び出すと、新しいインスタンスは作成されません。Collection.create() - コレクション INSTANCE に新しいモデルを作成するメソッド。インスタンスがない場合、どのように新しいモデルをそれに追加できますか?

于 2012-10-27T16:13:13.883 に答える
2

ここで何が起こっているのかをよりよく理解するために、 _. extend が行うことは次のとおりです。

ソース オブジェクトのすべてのプロパティをコピー先オブジェクトにコピーし、コピー先オブジェクトを返します。順序付けされているため、最後のソースが前の引数の同じ名前のプロパティをオーバーライドします。

したがって、Backbone.Collection.extend は、定義したソース オブジェクトを取得し、そのプロパティを Backbone.Collection に追加して、定義したものを拡張し、それを変数 window.MessageCollect に割り当てるだけです。

バックボーンコードを見ると、コレクションのプロトタイプをCreate、Add、toJsonなどのメソッドで「拡張」するということです...プロトタイプに追加されたので、関数自体ではなくBackbone.Collectionのインスタンスに適用されます、これはプロトタイプが行うことだからです

関数オブジェクトは Function.prototype から継承します。Function.prototype オブジェクトへの変更は、すべての Function インスタンスに反映されます。

ある意味では、次の単純なコードと同等です。

var Car = function(name){
    this.name = name;
}

var ford = new Car("ford");

Car.prototype.drive = function(){
    console.log("drive");
}

ford.drive(); //possible
Car.drive(); // not possible: Uncaught TypeError: object has no method 'drive'
​

</p>

于 2012-10-27T16:34:58.280 に答える