从singleton创建新实例

Kai*_*izo 8 javascript backbone.js

介绍:

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

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

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

  return new MyCollection();
});
Run Code Online (Sandbox Code Playgroud)

出于测试目的,我需要生成新实例以将它们作为依赖项注入.

题:

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

我做了什么:

我带来了一个解决方案:将类添加为instace的属性

    initialize: function () {
      this.ClassObject = MyCollection;
      //...
    }
Run Code Online (Sandbox Code Playgroud)

然后实例化它

var myCollection = require('myCollection');
var myCollectionInstance = new myCollection.ClassObject();
Run Code Online (Sandbox Code Playgroud)

这个解决方案修改了类,我想避免它.

我还尝试创建单例的副本:

function generateNewCollection() {
  var F = function () {};
  F.prototype = myCollection;
  return new F();
}
Run Code Online (Sandbox Code Playgroud)

它生成一个新实例,但它不会创建其依赖项的新实例,因此下一次测试的环境仍然很脏.

Kai*_*izo 2

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

var newMyCollection = new (Object.getPrototypeOf(myCollection).constructor);
Run Code Online (Sandbox Code Playgroud)