是否可能获得个人"全局";每个实例的模块?
import MyModule from './index.js';
const first = new MyModule();
const second = new MyModule();
// PLEASE SEE EXAMPLE BELOW FOR LOGS
// expect to log for both:
// 1. "in entry: true"
// 2. "in init: true"
// but second module logs:
// 1. "in entry: false"
// 2. "in init: false"
此处的问题是两者共享globals
和1。实例将属性更改为false
。
在每个实例的单个globals
模块中,我有哪些选项?
PS我有成千上万行的遗留代码。如果我不需要更改/删除/重构globals.js
内容,也不需要这些导入import globals from './globals.js';
,那会好100倍。尽管如此,说出你所有的想法——我需要解决它,即使我需要改变很多。
上述示例代码/最小可重复示例
index.js
import globals from './globals.js';
import init from './init.js';
export default function MyModule (conf) {
console.log('in entry:', globals.state1);
init();
}
globals.js
export default {
state1: true,
};
init.js
import globals from './globals.js';
export default function init () {
console.log('in init:', globals.state1);
globals.entry1 = false;
}
由于对象是通过引用传递的,因此每次使用globals
时都需要创建一个副本。
一个好的方法是导出一个函数,如:
/* globals.js */
const globals = { // Maybe wrap the object in Object.freeze() to prevent side effects
state1: true,
};
export default () => ({ ...globals });
然后,您可以在每次需要时调用该函数来创建一个副本。
/* init.js */
import getGlobals from './globals.js';
export default function init () {
const globals = getGlobals();
console.log('in init:', globals.state1);
globals.entry1 = false;
}