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

如何在动态创建的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 04:35:45