通过节点中的module.exports获取variables

我在类A.js中有一个variablesvar1 ,它是一个模块级variables。 但是,我有一些unit testing检查,以确保var1的内容是我所期望的。 为了让我的testing文件可以访问var1 ,我使用了module.exports

A.js

 var var1 = {}; function resetVar1() { var1 = {}; } module.exports.resetVar1 = resetVar1 function A() { // some init stuff } A.prototype.addVal = function (key, val) { // some code var1[key] = val; // some more code } module.exports.var1 = var1; 

我的testing用例也运行了一些更新A.js var1A.js 。 当我运行这个代码时,它A.var1在我的testing文件中第一次更新A.var1 ,但是在所有其他时间,它都不会被更新(如下所示)

testA.js

 var A = require('A'); test('test1', function (assert) { var a = new A(); a.addVal('key1', 'val1'); console.log(A.var1); // prints {'key1': 'val1'} }); test('test1', function (assert) { A.resetVar1(); var a = new A(); a.addVal('key2', 'val2'); console.log(A.var1); // still prints {'key1': 'val1'} }); 

A.js var1的行为与预期相同。 我的问题是为什么A.var1第一次在testA.js调用addVal时得到更新,但是没有其他时间?

当你这样做:

 module.exports.var1 = var1; 

您正在将module.exports.var1指向与var1相同的对象。 这大概是你想要的。

但是,当你用这个调用resetVar1()时:

 function resetVar1() { var1 = {}; } 

这给var1一个新的空对象。 但是, module.exports.var1仍然指向原始对象,因此此模块外部的任何人都不会看到新variables。 如果您真的想将共享对象重置为空对象,但不想中断共享,则不需要为其分配新对象,而只需删除现有对象上的所有属性。

 // remove all properties from the var1 object // so we can clear it, but not break the references to it that others have function resetVar1() { for (var prop in var1) { if (var1.hasOwnProperty(prop)) { delete var1[prop]; } } } 

module.exports.var1 = var1; 将本地作用域的var1variables(最初的空对象)的值设置为导出的属性。 当您稍后在resetVar1var1设置一个新值时,导出的属性仍然具有原始对象,因此您会得到相同的结果。

用户jfriend00是正确的,你必须删除每个属性,而不是分配一个新的对象。

另一种方法是使用一个具有clear方法的Map

 var var1 = new Map(); module.exports.var1 = var1; ... function A() {} A.prototype.addVal = function(key, val) { var1.set(key, val); } A.prototype.getVal = function(key) { return var1.get(key); } ... function resetVar() { var1.clear(); } module.exports.resetVar = resetVar;