我接管了一个研究项目,并且做得很好,除了最近,我认为我误解了在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(){…}
});
});
遵循第一个结构,在一些新模型和集合上,我收到错误Uncaught TypeError: object is not a function
或Uncaught TypeError: [Object object] is not a function
或Uncaught TypeError: undefined is not a function
,这取决于省略结束返回语句,或者只是返回对象彻头彻尾。
我在另一个View中调用构造函数,如下所示:this.newerCollection = new NewerCollection();
答案 0 :(得分:4)
extend
总是返回一个函数,该函数用作你扩展的Model / Collection / View的构造函数。
在这个代码块(问题中的第一个)中,您将返回一个函数,它是扩展模型的构造函数:
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
});
在此代码块(问题中的第二个)中,您将返回一个对象,而不是函数,因为您已使用measuresCollection
实例化new
。 measuresCollection
变量本身就是构造函数:
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`
});
如果您尝试使用该模块的值来实例化一个新对象,您将得到“对象不是函数”错误。
在此代码块中(问题中的第三个块)将等同于第二个块中的return
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
,当您尝试使用它来实例化对象时,您将得到“未定义不是函数”错误。 / p>
在第1和第3代码块中返回构造函数的方式基本上没有区别。前者只是在返回之前将构造函数赋值给局部变量。这样做的唯一原因是如果你需要在返回之前操纵它。