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"
如何防止这种情况发生?
您有几个选择:
如果您不需要在模块中更改配置对象的 属性 值,freeze 在加载它时:
config = Object.freeze({something: "new value"});
你仍然可以替换它(在模块内部),你只是不能改变它的属性值。
导出一个proxy只允许检索信息,不更新它。
let realConfig = null;
const config = new Proxy({}, {
get(target, propName) {
return realConfig && realConfig[propName];
}
});
(您可能选择实施更多的代理陷阱,而不仅仅是 get
。)
导出一个函数,允许调用者接收配置的防御性副本,而不是实际配置。
#1 似乎最适用于问题中的代码。
有什么方法可以防止导出的对象在导入时被修改吗? 我有我的 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"
如何防止这种情况发生?
您有几个选择:
如果您不需要在模块中更改配置对象的 属性 值,freeze 在加载它时:
config = Object.freeze({something: "new value"});
你仍然可以替换它(在模块内部),你只是不能改变它的属性值。
导出一个proxy只允许检索信息,不更新它。
let realConfig = null; const config = new Proxy({}, { get(target, propName) { return realConfig && realConfig[propName]; } });
(您可能选择实施更多的代理陷阱,而不仅仅是
get
。)导出一个函数,允许调用者接收配置的防御性副本,而不是实际配置。
#1 似乎最适用于问题中的代码。