node js中的module.exports是否为导出的对象或函数创建浅拷贝或深拷贝?

时间:2017-06-10 15:42:07

标签: javascript node.js import deep-copy shallow-copy

例如,

如果我有2个模块try1.js和try2.js

try1.js
   module.exports.msg = "hello world";

try2.js
   try1 = require('./try1');
   try1.msg = "changed message";

try2.js中msg内容的变化是否会影响try1.js中msg的尝试值?

2 个答案:

答案 0 :(得分:6)

根本没有副本。 module.exports是一个对象,该对象直接共享。如果您修改该对象的属性,则所有已加载该模块的人都将看到这些更改。

  

try2.js中msg内容的变化是否会影响try1.js中msg的尝试值?

是的,确实如此。没有副本。 exports对象直接共享。您对该导出对象所做的任何更改都将被使用该模块的所有人看到。

仅供参考,模块可以使用Object.freeze(module.exports)来阻止在添加所需属性后对该对象进行更改。

答案 1 :(得分:1)

是的,它会影响它。尝试执行以下操作。将此代码保存到文件m1.js:

module.exports.msg = 'hello world';

module.exports.prn = function() {
    console.log( module.exports.msg );
}

然后运行节点控制台并尝试以下操作:

> const m1 = require('./m1')
undefined
> m1.prn()
xxx
> m1.msg = 'changed'
'changed'
> m1.prn()
changed