Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 从singleton创建新实例 简介:_Javascript_Backbone.js - Fatal编程技术网

Javascript 从singleton创建新实例 简介:

Javascript 从singleton创建新实例 简介:,javascript,backbone.js,Javascript,Backbone.js,我有一些创建单例的遗留代码: define(['backbone', 'MyModel'], function (Backbone, MyModel) { var MyCollection = Backbone.Collection.extend({ model: MyModel, initialize: function () { //... } }); return new MyCollection(); }); function gen

我有一些创建单例的遗留代码:

define(['backbone', 'MyModel'], function (Backbone, MyModel) {

  var MyCollection = Backbone.Collection.extend({
    model: MyModel,
    initialize: function () {
      //...
    }
  });

  return new MyCollection();
});
function generateNewCollection() {
  var F = function () {};
  F.prototype = myCollection;
  return new F();
}
出于测试目的,我需要生成新实例,将它们作为依赖项注入

问题: 有没有办法在不修改原始代码的情况下生成新的单例实例

我所做的: 我提出了一个解决方案:将该类添加为Instance的属性

    initialize: function () {
      this.ClassObject = MyCollection;
      //...
    }
然后实例化它

var myCollection = require('myCollection');
var myCollectionInstance = new myCollection.ClassObject();
这个解决方案修改了类,我想避免它

我还尝试创建singleton的副本:

define(['backbone', 'MyModel'], function (Backbone, MyModel) {

  var MyCollection = Backbone.Collection.extend({
    model: MyModel,
    initialize: function () {
      //...
    }
  });

  return new MyCollection();
});
function generateNewCollection() {
  var F = function () {};
  F.prototype = myCollection;
  return new F();
}

它会生成一个新实例,但不会创建其依赖项的新实例,因此在接下来的测试中环境仍然是脏的。

将类定义添加为实例的属性是我找到的唯一解决此问题的方法。您可能希望将
Klass
标准化为属性名称,这似乎是人们的做法。这个解决方案可能感觉有点脏,但至少对我来说效果非常好

另一个增强,因为我注意到您正在使用模块模式,就是让模块返回一个实例。这样,它为您管理单例模式,因为它只包含每个依赖项一次

下面是它的样子:

define ['models/sprockets'],(Sprocket) ->
  MyCollection = Backbone.Collection.extend
    model: Sprocket
    initialize: -> console.log 'initialized'
  myCollection = new MyCollection()
  myCollection.Klass = MyCollection
  return myCollection # If managed by requireJs or curl, this module will always return you the same singleton and will have the class available on the `Klass` property

解决方案:使用原型中的构造函数

var newMyCollection = new (Object.getPrototypeOf(myCollection).constructor);

谢谢你的回答!但是我会尽量避免修改模块的原始代码,而您带来的增强正是导致我出现问题的原因:
returnnewmycollection()。我希望有一个具有方法
getInstance
的类,而不仅仅是实例。有了它,我可以获取实例,用类生成新实例,或者修改
getInstance
方法来返回新实例,这样在所有测试中都会有新实例,而无需注入。请不要在问javascript问题时使用coffe脚本。哈哈。咖啡脚本是未来,你会的。我浪费了太多的Javascript生涯,没有使用它。该上船了。我不反对咖啡脚本;我反对用咖啡回答JS问题。