导入含函数调用的对象时所有函数触发的问题求助
解决导入对象时所有mergeObject函数被触发的问题
问题原因
你当前的代码中,MyObject的所有属性值在模块被导入的瞬间就已经通过调用mergeObject完成了计算——JavaScript在解析对象字面量时,会立即执行所有属性的赋值表达式,不会等到你访问某个属性时才执行对应的函数调用。
解决方案
方案1:使用对象getter访问器(推荐,访问方式不变)
将属性定义为getter,这样只有当你主动访问该属性时,才会触发mergeObject的执行:
export const MyObject = { get value1() { return mergeObject({object of data}); }, get value2() { return mergeObject({object of data}); }, // ...其余属性 };
使用时依然保持MyObject.value1的写法,完全兼容原有代码逻辑。
方案2:改为函数式属性(直观明确)
把每个属性改成返回合并结果的函数,调用时才执行mergeObject:
export const MyObject = { value1: () => mergeObject({object of data}), value2: () => mergeObject({object of data}), // ...其余属性 };
访问时需要调整为MyObject.value1(),这种方式能清晰体现“获取结果需要执行计算”的逻辑。
方案3:带缓存的懒加载(避免重复计算)
如果希望同一属性多次访问时只执行一次mergeObject,可以封装一个懒加载工具函数:
function lazyMerge(targetData) { let cache; return () => { if (!cache) { cache = mergeObject(targetData); } return cache; }; } export const MyObject = { value1: lazyMerge({object of data}), value2: lazyMerge({object of data}), // ...其余属性 };
访问时使用MyObject.value1(),第一次调用会执行mergeObject并缓存结果,后续调用直接返回缓存值,提升性能。
内容的提问来源于stack exchange,提问作者Derek Glassick
相关产品推荐
相关产品推荐

