如何在动态创建的JavaScript getter中直接使用变量值?

1bqhqjot  于 2023-02-11  发布在  Java
关注(0)|答案(2)|浏览(143)

我有下面的代码,用于动态地向对象添加getter:

const obj = {};
const uni = { name1: ..., name2: ..., ...};
for(const nm in uni) {
  const u = obj[nm] = {};
  Object.defineProperty(u, 'value', {
    configurable: true,
    enumerable: true,
    get: () => { return uni[nm] },
  });
}

我希望getter返回不同的值,所以我希望uni[nm]被理解为字面意义上的,即第一个getter返回uni.name1,第二个getter返回uni.name2,以此类推。
我该怎么做呢?
编辑:
我想动态创建一个对象,如下所示:

{
  name1: { get value() { return uni.name1 }},
  name2: { get value() { return uni.name2 }},
  ...
}
byqmnocz

byqmnocz1#

Don't use for..in。你几乎从来不需要Object.defineProperty。这都是石器时代的JavaScript。
相反,使用-

const uni = { name1: "foo", name2: "bar" }

let obj = {}

for(const key of Object.keys(uni)) {
  obj[key] = {
    get value() {
      return uni[key]
    }
  };
}

console.log(obj.name1.value) // "foo"
console.log(obj.name2.value) // "bar"

uni.name1 = "zzz"
console.log(obj.name1.value) // "zzz"

这可以用array.reduce和-表示

  • object spread扩展对象的定义
  • 计算属性来定义动态键-
const uni = { name1: "foo", name2: "bar" }

const obj = Object.keys(uni).reduce(
  (o, key) => {
    return {...o, [key]: { get value() { return uni[key] }}} // extend
  },
  {} // initial object
)

console.log(obj.name1.value) // "foo"
console.log(obj.name2.value) // "bar"

uni.name1 = "zzz"
console.log(obj.name1.value) // "zzz"
ogq8wdun

ogq8wdun2#

您可以通过使用方括号符号([])动态访问uni对象中的属性来实现这一点,如下所示:

相关问题