如何定义makeDynamicConfig与dynamicConfigValue实现JS动态对象值更新?
解决方案
要实现需求,核心是让对象的属性值在访问时动态计算,而非初始化时就固定。可以通过Object.defineProperty为每个属性定义getter,这样当JSON.stringify序列化对象时,会调用getter获取最新的currentConfig值。
完整代码
let currentConfig = 'initial' const changeConfig = (config) => { currentConfig = config; } function dynamicConfigValue(key) { // 仅返回标识用的key,后续在getter中结合currentConfig生成值 return key; } function makeDynamicConfig(protoObj) { const dynamicObj = {}; // 遍历传入的对象,为每个属性定义动态getter for (const [propName, key] of Object.entries(protoObj)) { Object.defineProperty(dynamicObj, propName, { get() { // 每次访问属性时,使用最新的currentConfig生成值 return `${currentConfig}:${key}`; }, // 必须设置为可枚举,否则JSON.stringify会忽略该属性 enumerable: true }); } return dynamicObj; } const object = makeDynamicConfig({ key: dynamicConfigValue('key'), key2: dynamicConfigValue('key2'), }); changeConfig('new'); const object_new = JSON.stringify(object); // 此时object_new的值为 {"key":"new:key","key2":"new:key2"}
原理说明
dynamicConfigValue仅负责传递后续需要拼接的key,不直接计算最终值;makeDynamicConfig接收初始配置对象后,创建新对象并为每个属性绑定getter。getter不会立即执行,只有当属性被访问(比如JSON.stringify序列化时)才会触发,此时会使用最新的currentConfig生成结果;- 必须设置
enumerable: true,否则JSON.stringify会跳过该属性。
内容的提问来源于stack exchange,提问作者ikratkiy
相关产品推荐
相关产品推荐

