在Backbone,js中实例化对象与函数

Instantiation of an object vs function in Backbone,js

本文关键字:对象 函数 实例化 Backbone js      更新时间:2023-09-26

我接手了一个研究项目,做得很好,只是最近我觉得我误解了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 functionUncaught TypeError: [Object object] is not a functionUncaught 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实例化了一个measuresCollectionmeasuresCollection变量本身就是构造函数:

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`
});

如果你试图使用该模块的值来实例化一个新对象,你会得到"对象不是函数"的错误。

在该代码块中(问题中的第三块)将等效于第二块中的returnmeasuresCollection。在那里,你返回的是一个函数,而不是一个对象,就像第一个块一样

define([…], function(…){
  return Backbone.Collection.extend({  // this is returning a function, the same as the first code block
    model: newerModel,
    initialize: function(){…}
  });
});

如果您在模块中省略了return语句,它将返回undefined,并且当您尝试使用它来实例化对象时,您将得到"未定义的不是函数"错误。

在第一个和第三个代码块中返回构造函数的方式基本上没有区别。前者只是在返回之前将构造函数分配给一个局部变量。这样做的唯一原因是在返回之前需要对其进行操作。