You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何定义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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 10:52:46