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问题。