在Backbone,js中实例化对象与函数
Instantiation of an object vs function in Backbone,js
我接手了一个研究项目,做得很好,只是最近我觉得我误解了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
,这取决于省略了结束return语句,或者只是直接返回对象。
我在另一个视图中调用构造函数,如下所示:this.newerCollection = new NewerCollection();
- 为什么我使用相同的结构得到(任何)这些错误
- 创建变量和返回变量以及直接返回变量之间有什么区别
- 为什么我会用一种方式而不是另一种方式
extend
始终返回一个函数,该函数用作您扩展的模型/集合/视图的构造函数。
在这个代码块(问题中的第一个)中,您将返回一个函数,它是扩展模型的构造函数:
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
});
在这个代码块(问题中的第二个)中,您返回的是一个对象,而不是一个函数,因为您已经使用new
实例化了一个measuresCollection
。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
,并且当您尝试使用它来实例化对象时,您将得到"未定义的不是函数"错误。
在第一个和第三个代码块中返回构造函数的方式基本上没有区别。前者只是在返回之前将构造函数分配给一个局部变量。这样做的唯一原因是在返回之前需要对其进行操作。
- 创建对象函数原型和代码是错误的
- JavaScript模块模式-如何在使用对象/函数之前激发构造函数/init函数
- 如何从onclick字符串中引用javascript对象函数
- 更改对象函数仅用于示例
- javascript和jQuery的嵌套对象函数中的变量范围
- 将对象函数传递给请求动画帧时丢失对象引用
- 对象函数返回函数而不是值
- 使用onclick调用属性对象函数
- javascript拉斐尔对象函数传递
- 如何从onClick事件调用对象函数
- 可以't获取具有“t”的对象变量;这个“;由setTimeout()函数调用的对象函数中的属性
- 对象没有't继承父对象函数
- 调用父对象函数
- "这个“;对象函数内部的引用
- 将变量添加到对象函数调用的末尾
- 传单错误:对象函数没有方法'createIcon'在LayerGroup中创建自定义图标标记时
- TypeError:对象函数Object(){〔本机代码〕}没有方法'方法'
- 挖空 - 单击绑定到对象函数 - 范围问题
- 类型错误: 对象函数...没有方法“打开”
- JavaScript 对象函数