具有相同代码结构的两个不同的导入模块共享相同的功能参考

时间:2018-08-28 08:04:28

标签: node.js

我在不同/相同目录中有两个具有相同代码的模块。它返回一个带有闭包的对象。返回的对象具有两个属性init和log。 init方法将一个函数作为参数,并将其分配给闭包。

// module1.js
module.exports = function () {
    var moduleInstance = this;

    moduleInstance.logger = function () {
        console.log('module 1 default logger')
    };
    return {
        init: function (logger) {
            moduleInstance.logger = logger
        },
        log: function () {
            console.log('in module 1 log function');
            moduleInstance.logger();
        }
    }
}();

// ./module2.js
module.exports = function () {
    var moduleInstance = this;

    moduleInstance.logger = function () {
        console.log('module 2 default logger')
    };
    return {
        init: function (logger) {
            moduleInstance.logger = logger
        },
        log: function () {
            console.log('in module 2 log function');
            moduleInstance.logger();
        }
    }
}();
如果我导入2个模块,请在我的代码中

const module1 = require('./module1');
const module2 = require('./module2');
module1.init(function () {
    console.log('logger 1')
});
module2.init(function () {
    console.log('logger 2')
});
module1.log(); 
module2.log();

// expected output
// in module 1 log function
// logger 1
// in module 2 log function
// logger 2

// actual output
// in module 1 log function
// logger 2 
// in module 2 log function
// logger 2

根据文档,节点应基于文件名缓存模块。但是在这里它没有按预期工作。

需要了解其工作原理吗?

1 个答案:

答案 0 :(得分:1)

这是问题所在:var moduleInstance = this;this引用了module.exports对象,因此在您的代码中您实际设置并再次重置了module.exports.logger = ...。将此行替换为var moduleInstance = {};,您将获得预期的结果:

in module 1 log function
logger 1
in module 2 log function
logger 2