Backbone Collections - 是create()一个实例方法吗?

时间:2012-10-27 15:48:35

标签: javascript oop backbone.js

我有一组像这样的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' 

2 个答案:

答案 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'
​