gpt4 book ai didi

javascript - 获取对象的任意属性

转载 作者:行者123 更新时间:2023-11-29 10:30:20 24 4
gpt4 key购买 nike

我有一个看起来像这样的类

export default class {
constructor () {
this.store = {}
}

setX (x, y) {
this.store[x] = y
}
}

我如何在 this.store 上定义一个 getter 以在获取未定义的值时返回 0

举个例子:

setX('a', 1) 会将 this.store['a'] 设置为 1

然后 this.store['a'] 将按预期返回 1

但是 this.store['b'] 会返回 undefined,但我希望 getter 返回 0(并且可能调用setX('b', 0),还不确定)。

我知道我可以使用 Object.defineProperty 来定义一个自定义的 getter,我只是想不通如何访问 store< 的一个任意的、尚未定义的属性 对象。

这完全有可能还是我必须使用这样的解决方法?

getX (x) {
return this.store[x] || 0
}

我想避免这种情况,因为 this.store[x] 看起来干净多了。

最佳答案

How would I define a getter on this.store to return 0 when getting an undefined value?

除非您可以预料到您想要支持的所有可能的属性名称并为它们定义 getter,否则您需要 Proxyget trap ,这是 ES2015 的新内容(并且不能填充)。代理在性能方面很昂贵,只有在您真正需要它们时才使用它们。

例子:

class Example {
constructor () {
this.store = new Proxy({}, {
get(target, property) {
return property in target ? target[property] : 0;
}
});
}

setX (x, y) {
this.store[x] = y;
}
}

const e = new Example();
console.log("Setting a");
e.setX("a", "foo");
console.log("a = " + e.store.a);
console.log("b = " + e.store.b);

当然,如果您将 store 设为私有(private),则可以仅通过对象上的 getX 方法强制访问,这将避免使用代理,但代价是在每个实例的基础上定义 setXgetX(现在,private data is coming):

class Example {
constructor () {
const store = {};
this.setX = (x, y) => {
store[x] = y;
};
this.getX = x => {
return x in store ? store[x] : 0;
};
}
}

const e = new Example();
console.log("Setting a");
e.setX("a", "foo");
console.log("a = " + e.getX("a"));
console.log("b = " + e.getX("b"));

关于javascript - 获取对象的任意属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47868247/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com