JavaScript导出对象深拷贝:各导入模块是否获不同副本?
问题解答
所有导入该模块的代码,都会接收到同一个对象副本。
原因是Node.js的模块系统自带缓存机制:当模块第一次被加载时,会执行模块内的代码,将module.exports的结果存入缓存。后续任何模块再次导入它时,不会重新执行模块代码,直接返回缓存里的那个对象。
哪怕你用JSON.parse(JSON.stringify(obj))创建了新对象,这个对象也只会在模块首次加载时创建一次,之后所有导入操作拿到的都是缓存里的这个实例。
可以用以下代码验证:
// 导出模块(比如test.js) const obj = {A: 2}; module.exports = JSON.parse(JSON.stringify(obj)); // 导入模块1 const obj1 = require('./test.js'); obj1.A = 3; // 导入模块2 const obj2 = require('./test.js'); console.log(obj2.A); // 输出3,说明obj1和obj2是同一个对象
内容的提问来源于stack exchange,提问作者Bear Bile Farming is Torture
相关产品推荐
相关产品推荐

