我有一些创建单身的遗留代码:
define(['backbone', 'MyModel'], function (Backbone, MyModel) {
var MyCollection = Backbone.Collection.extend({
model: MyModel,
initialize: function () {
//...
}
});
return new MyCollection();
});
出于测试目的,我需要生成新实例以将它们作为依赖项注入。
有没有办法在不修改原始代码的情况下生成单例的新实例?
我提供了一个解决方案:将该类添加为instace的属性
initialize: function () {
this.ClassObject = MyCollection;
//...
}
然后实例化它
var myCollection = require('myCollection');
var myCollectionInstance = new myCollection.ClassObject();
这个解决方案修改了类,我想避免它。
我还尝试创建单身人士的副本:
function generateNewCollection() {
var F = function () {};
F.prototype = myCollection;
return new F();
}
它生成一个新实例,但它不会创建其依赖项的新实例,因此下一次测试的环境仍然很脏。
答案 0 :(得分:2)
解决方案:使用原型中的构造函数。
var newMyCollection = new (Object.getPrototypeOf(myCollection).constructor);
答案 1 :(得分:-1)
将类定义添加为实例的属性是我找到解决此问题的唯一方法。您可能希望将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