我在类var1
中有一个变量A.js
,它是一个模块级变量。但是,我有一些单元测试检查以确保var1
的内容符合我的预期。为了使我的测试文件可以访问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;
我的测试用例还运行了一些更新var1
A.js
的代码。当我运行此代码时,它会第一次在我的测试文件中更新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'}
});
var1
中的 A.js
表现得与预期一致。我的问题是为什么A.var1在testA.js
第一次调用addVal时会更新,但不是在任何其他时间?
答案 0 :(得分:2)
执行此操作时:
module.exports.var1 = var1;
您将module.exports.var1
指向与var1
相同的对象。这大概就是你想要的。
但是,当你用{:1}调用resetVar1()
时
function resetVar1() {
var1 = {};
}
这会为var1
分配一个新的空对象。但是,module.exports.var1
仍指向原始对象,因此此模块之外的任何人都不会看到新变量。如果您确实希望将共享对象重置为空对象,但又不想中断共享,则不需要为其分配新对象,而只需删除现有对象上的所有属性。
// 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];
}
}
}
答案 1 :(得分:0)
module.exports.var1 = var1;
将本地范围的var1
变量(初始空对象)的值设置为导出的属性。当您稍后在var1
内将新值设置为resetVar1
时,导出的属性仍然具有原始对象,因此您可以获得相同的结果。
答案 2 :(得分:0)
用户jfriend00是正确的,您必须删除每个属性而不是分配新对象。
另一种方法是使用Map
,其clear
方法。
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;