JavaScript 防止更改导出的对象

JavaScript prevent changing exported object

有什么方法可以防止导出的对象在导入时被修改吗? 我有我的 config.js 助手来管理我的配置,我想导出配置,但我只想允许在 config.js

中进行更改
let config = null

const refreshConfig = async () => {
  config = {something: "newvalue"}
}

export {config, refreshConfig}

但是这样,我可以在其他地方更改它,例如:

import {config} from 'config.js'

config.something = "changing it now"

如何防止这种情况发生?

您有几个选择:

  1. 如果您不需要在模块中更改配置对象的 属性 值,freeze 在加载它时:

    config = Object.freeze({something: "new value"});
    

    你仍然可以替换它(在模块内部),你只是不能改变它的属性值。

  2. 导出一个proxy只允许检索信息,不更新它。

    let realConfig = null;
    
    const config = new Proxy({}, {
        get(target, propName) {
            return realConfig && realConfig[propName];
        }
    });
    

    (您可能选择实施更多的代理陷阱,而不仅仅是 get。)

  3. 导出一个函数,允许调用者接收配置的防御性副本,而不是实际配置。

#1 似乎最适用于问题中的代码。