Backbone和原型init

时间:2012-07-07 12:38:28

标签: javascript backbone.js prototype

我有一个代码:

Application = function() {
    Application.prototype.currentQuote.collection.fetch();
};

Application.prototype = {}

Application.prototype.currentQuote = {};
Application.prototype.currentQuote.model = new (Backbone.Model.extend({
    defaults: {
        products: []
    }
}))();

Application.prototype.currentQuote.collection = new (Backbone.Collection.extend({
    model: Application.prototype.currentQuote.model,
    url: 'test.json'
}))();

App = new Application();

但是,当获取集合时,我得到“Uncaught TypeError:object is not a function”错误。 我不明白为什么,我能解决什么问题?

您可以在此处查看测试用例:https://dl.dropbox.com/u/15806777/development/bb/index.html

谢谢!

2 个答案:

答案 0 :(得分:3)

我猜你的问题就在这里:

Application.prototype.currentQuote.collection = new (Backbone.Collection.extend({
    model: Application.prototype.currentQuote.model, // <------------------------
    url: 'test.json'
}))();

collection's model是:

  

集合包含的模型类。

所以model应该来自Backbone.Model.extend({...})(即“class”),而不是来自new (Backbone.Model.extend({...}))的东西(即模型实例)。当你要求集合创建一些模型时(通过构造函数调用,fetchadd,...),集合需要一些可以使用new的东西,你可以' t new model_instance,因为new operator needs a constructor function

  

new运算符创建用户定义对象类型的实例或具有构造函数的内置对象类型之一。

这就是你的“Uncaught TypeError:object is not function”错误来自。

你需要这样的东西:

Application.prototype.currentQuote.Model = Backbone.Model.extend({
    defaults: {
        products: []
    }
});
//...
Application.prototype.currentQuote.collection = new (Backbone.Collection.extend({
    model: Application.prototype.currentQuote.Model,
    url: 'test.json'
}))();

答案 1 :(得分:2)

这种架构非常奇特。目前尚不清楚你想要实现的目标。我建议做一些关于函数原型如何工作的阅读。但更有可能的是,你的意图更像是这样:

(function () {
  var CurrentQuote, CurrentQuoteSet;

  function Application() {
    this.collection = new CurrentQuoteSet;
    this.collection.fetch();
  };

  CurrentQuote = Backbone.Model.extend({
    defaults: {
      products: []
    }
  });

  CurrentQuoteSet = Backbone.Collection.extend({
    model: CurrentQuote,

    url: "test.json"
  });

  window.App = new Application;
})();