在JavaScript中模拟按引用传递
我所有的单元测试都有一些通用代码,我可以运行这些代码并将其抽象为一个函数。但是,我希望能够在每次测试中重复使用在JavaScript中模拟按引用传递,javascript,node.js,pass-by-reference,ecmascript-5,Javascript,Node.js,Pass By Reference,Ecmascript 5,我所有的单元测试都有一些通用代码,我可以运行这些代码并将其抽象为一个函数。但是,我希望能够在每次测试中重复使用核心值 function makeSuite(name, module, callback) { suite(name, function () { var Core = {}; setup(function () { Core = Object.create(core).constructor();
核心
值
function makeSuite(name, module, callback) {
suite(name, function () {
var Core = {};
setup(function () {
Core = Object.create(core).constructor();
Core.module("name", module);
});
teardown(function () {
Core.destroy();
});
callback(Core);
});
}
makeSuite("Server", server, function (Core) {
test("server creates a server", useTheCore);
test("server listens to a port", useTheCore);
test("server emits express app", useTheCore);
test("server destroys itself", useTheCore);
});
每次我调用useTheCore
时,我都希望core具有不同的值。这是因为特定的单元测试库在每次测试之前都会调用setup
方法。这显然不起作用,因为我正在按值向回调传递{}
。当我覆盖Core
时,它不会传播
我可以使用\uuu proto\uu
来模拟按引用传递
function makeSuite(name, module, callback) {
suite(name, function () {
var ref = {};
setup(function () {
var Core = ref.__proto__ = Object.create(core).constructor();
Core.module("name", module);
});
teardown(function () {
ref.__proto__.destroy();
});
callback(ref);
});
}
- 是否有一种更优雅的方法来模拟按引用传递,最好不要使用不推荐使用的非标准
\uuuuu proto\uuuu
- 对于代码重用的实际问题,有没有更优雅的解决方案
我不知道你是否会考虑这个优雅,但它解决了非标准的问题。你能在
var-Core={}上放置一个丑陋的属性吗代码>对象,如Core.\uuuuucore\uuu internal\u data\uuuu=object.create(Core.constructor()代码>,然后让API预测该属性的存在?有点像NodeJS对其事件发射器系统所做的。@amnotiam这意味着我必须将回调更改为引用为函数(){doSomething(u.Core);}
,这是可能的,但很难看。我想继续使用<<代码>核心>代码>变量,我不认为你会认为它是安全的/可靠的。因此,在第一次调用setup
之后,您将开始执行Object.create(core.constructor.apply(Object.getPrototypeOf(ref))
@amnotiam实际上我不需要这样做Core.destroy()
干净地将核心重置为初始状态,这样我就可以不断地应用模块
和销毁
。