如何将包含JS函数的对象转为字符串并替换变量为实际值?
解决对象转字符串时函数内变量引用替换为实际值的问题
你需要把包含JavaScript函数的对象转成字符串配置传给第三方库,但目前用自定义objToString转换后,函数里的TEST.Success还保留着_config.TEST.Success这种引用形式,想要直接替换成实际值"success"。下面是具体的解决方案:
核心思路
要实现这个需求,关键是在序列化函数的时候,先解析函数体内的变量引用,把它替换成配置对象里的实际值,再完成字符串化。可以通过正则匹配引用路径,结合属性查找来实现替换。
完整代码示例
原始配置与常量
const TEST = { Success: "success" }; const _config = { TEST, onSuccess: function () { return this.TEST.Success; } };
修改后的转换函数
function objToString(obj) { // 替换函数内的this.xxx引用为实际值 function replaceFunctionReferences(fn, context) { const fnStr = fn.toString(); // 匹配嵌套的this.xxx.yyy形式的引用 const regex = /this\.([\w\.]+)/g; return fnStr.replace(regex, (match, propPath) => { // 按属性路径从配置中查找实际值 let value = context; for (const prop of propPath.split('.')) { value = value[prop]; if (value === undefined) break; } // 字符串类型值要加引号,其他类型直接转字符串 return typeof value === 'string' ? `"${value}"` : String(value); }); } // 递归处理对象的各个属性 function stringify(obj) { if (typeof obj === 'function') { return replaceFunctionReferences(obj, _config); } if (typeof obj !== 'object' || obj === null) { return JSON.stringify(obj); } if (Array.isArray(obj)) { return `[${obj.map(stringify).join(',')}]`; } // 处理普通对象的键值对 const entries = Object.entries(obj).map(([key, val]) => `"${key}": ${stringify(val)}` ); return `{${entries.join(',')}}`; } return stringify(obj); }
测试输出
调用objToString(_config)后,输出结果如下:
{"TEST":{"Success":"success"},"onSuccess":function () { return "success"; }}
关键说明
replaceFunctionReferences函数负责提取函数体内容,用正则匹配this.xxx.yyy格式的引用,然后根据属性路径从配置对象中找到对应的值,替换到函数体里。- 针对字符串类型的值,替换时会自动添加双引号,保证函数逻辑在字符串化后依然正确。
- 递归的
stringify函数可以处理嵌套对象、数组等复杂结构,确保整个配置对象都能正确转换。
内容的提问来源于stack exchange,提问作者Cristian Muscalu
相关产品推荐
相关产品推荐

