我有一组像这样的Backbone模型:
window.Message = Backbone.Model.extend({});
window.MessageCollect = Backbone.Collection.extend({ model: Message, url: '/messages'});
为什么我必须实例化一个新的集合才能调用create()?如果我在MessageCollect上调用create(),我会得到一个no方法错误。
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'
答案 0 :(得分:2)
因为Backbone.Collection - 是一个类,而不是一个实例。当您调用Backbone.Collection.extend扩展基类时,不会创建新实例。 Collection.create() - 在集合INSTANCE中创建新模型的方法。当您没有实例时,如何将新模型添加到其中?
答案 1 :(得分:2)
为了更好地了解这里发生了什么,here is what _.extend does:
将源对象中的所有属性复制到 目标对象,并返回目标对象。这是有序的, 所以最后一个源将覆盖相同名称的属性 以前的论点。
所以Backbone.Collection.extend只是获取你定义的源对象并将其属性添加到Backbone.Collection中,以便它根据你定义的内容进行扩充,然后将其分配给你的变量window.MessageCollect。
看backbone code,它做的是它用这些方法“扩展”Collection的原型创建,添加,toJson等...因为它添加到原型然后它适用于Backbone.Collection的实例而不是函数本身,因为它是what prototype does
函数对象继承自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'