通过node.exports在节点中获取变量

时间:2015-09-14 23:26:15

标签: javascript node.js require

我在类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时会更新,但不是在任何其他时间?

3 个答案:

答案 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;