如何在动态创建的JavaScript getter中正确绑定对应变量值?
问题解决:动态为对象添加独立的getter
你的问题出在闭包对循环变量的捕获上,原代码里的箭头函数会捕获循环中nm变量的引用,如果循环变量没有形成独立作用域,所有getter最终都会指向同一个nm值(循环结束时的最后一个属性名),导致返回结果一致。
下面是几种可行的实现方式:
方法1:利用forEach的独立作用域(推荐)
通过Object.entries遍历uni的键值对,forEach的回调函数每次迭代都会创建独立作用域,确保每个getter捕获到当前的属性名:
const obj = {}; const uni = { name1: '值1', name2: '值2', name3: '值3' }; Object.entries(uni).forEach(([nm]) => { obj[nm] = { // 直接在对象字面量中定义getter get value() { return uni[nm]; } }; });
方法2:使用立即执行函数(IIFE)创建独立作用域
如果需要兼容旧环境,可以用IIFE为每次迭代创建单独的作用域,保存当前的属性名:
const obj = {}; const uni = { name1: '值1', name2: '值2', name3: '值3' }; for (const nm in uni) { // 通过IIFE传入当前迭代的nm,形成独立作用域 (function(currentNm) { const u = obj[currentNm] = {}; Object.defineProperty(u, 'value', { configurable: true, enumerable: true, get: function() { return uni[currentNm]; } }); })(nm); }
方法3:确保循环变量的块级绑定(ES6+)
如果你的环境支持ES6+,可以改用for...of遍历Object.keys(uni),确保每个迭代的nm都是独立的块级变量:
const obj = {}; const uni = { name1: '值1', name2: '值2', name3: '值3' }; for (const nm of Object.keys(uni)) { obj[nm] = { get value() { return uni[nm]; } }; }
验证效果
执行以下代码可以验证每个getter返回对应的值:
console.log(obj.name1.value); // 输出"值1" console.log(obj.name2.value); // 输出"值2" console.log(obj.name3.value); // 输出"值3"
内容的提问来源于stack exchange,提问作者user9163823
相关产品推荐
相关产品推荐

