0

我有一系列 Backbone 模型,如下所示:

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

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

为什么我必须实例化一个新集合才能调用 create()?如果我在 MessageCollect 上调用 create(),则会收到无方法错误。

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() - 在集合实例中创建新模型的方法。当您没有实例时,如何将新模型附加到其中?

于 2012-10-27T16:13:13.883 回答
2

为了更好地理解这里发生了什么,下面是 _.extend 的作用

将源对象中的所有属性复制到目标对象,然后返回目标对象。它是有序的,因此最后一个源将覆盖先前参数中的同名属性。

所以 Backbone.Collection.extend 只是获取您定义的源对象并将其属性添加到 Backbone.Collection,以便它使用您定义的内容进行扩充,然后将其分配给您的变量 window.MessageCollect。

查看主干代码,它的作用是使用 Create、Add、toJson 等这些方法“扩展”Collection 的原型......因为它添加到原型中,所以它适用于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 回答