通过节点中的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
var1
的A.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;
将本地作用域的var1
variables(最初的空对象)的值设置为导出的属性。 当您稍后在resetVar1
为var1
设置一个新值时,导出的属性仍然具有原始对象,因此您会得到相同的结果。
用户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;