从singleton创建新实例
Create new instance from singleton
简介:
我有一些遗留代码可以创建一个单例:
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();
这个解决方案修改了类,我想避免它
我还尝试创建一个singleton的副本:
function generateNewCollection() {
var F = function () {};
F.prototype = myCollection;
return new F();
}
它生成了一个新实例,但没有创建其依赖项的新实例,因此环境对于下一次测试来说仍然很脏。
解决方案:使用原型中的构造函数。
var newMyCollection = new (Object.getPrototypeOf(myCollection).constructor);
添加类定义作为实例的属性是我找到的解决此问题的唯一方法。您可能希望将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
相关文章:
- 显示模块模式在Knockout中设置模型的新实例
- 如何基于数组值创建新实例
- VS2010 javascript调试器希望在VS2010的新实例中启动
- Web服务器意外退出,正在重新启动新实例
- JavaScript - 有没有办法动态创建对象的新实例
- CKEditor新实例始终处于卸载状态
- JavaScript中Var类型的新实例
- jQueryFileTree如何清除实例、重新实例化新实例或刷新
- 使用模块模式时,如何创建对象的新实例
- requirejs 模块的许多新实例
- 作用域变量正在创建引用而不是新实例
- 猫鼬数据不会保存模型的新实例
- 如何将当前日期动态添加到对象的新实例并将其推送到数组
- 如何通过请求动画帧从其新实例中移动形状
- Javascript 重新加载以加载新实例,而不是重新加载页面
- 无法在 javascript 中创建新实例
- 创建 JavaScript 自定义应用程序的新实例
- 从javascript中的未知对象创建新实例
- Array.prototype.fill() 带有对象传递引用而不是新实例
- 函数是否无法返回构造函数并创建新实例