js动态访问私有字段(properties/members)
js dynamically access private fields (properties/members)
我正在尝试新的 class private member feature 但是,我很快 运行 遇到一个问题:如何动态访问它们?
我希望它遵循任何一个
的预先存在的语法
constructor(prop, val) {
this[`#${prop}`] = val; // undefined
}
或
constructor(prop, val) {
this.#[prop] = val; // syntax error
}
然而,以上两种方法都失败了。
我认为您不能动态访问私有字段。 proposal 表示:
There are no private computed property names: #foo
is a private identifier, and #[foo]
is a syntax error.
来自私有属性提案的常见问题解答:
Dynamic access to private fields is contrary to the notion of 'private'.
无法动态访问私有字段是设计使然。
如果你真的想这么做。
eval(`this.#${propertyName}`)
但这只是打开了一个非常丑陋的蠕虫罐头。
另一种选择是为要动态访问的密钥设置一个私有对象:
class privateTest {
#pvt = {}
constructor(privateKey, privateVal) {
this.#pvt[privateKey] = privateVal;
}
getPrivate(privateKey) {
return this.#pvt[privateKey];
}
}
const test = new privateTest('hello', 'world');
console.log(test.getPrivate('hello')) // world
我正在尝试新的 class private member feature 但是,我很快 运行 遇到一个问题:如何动态访问它们?
我希望它遵循任何一个
的预先存在的语法constructor(prop, val) {
this[`#${prop}`] = val; // undefined
}
或
constructor(prop, val) {
this.#[prop] = val; // syntax error
}
然而,以上两种方法都失败了。
我认为您不能动态访问私有字段。 proposal 表示:
There are no private computed property names:
#foo
is a private identifier, and#[foo]
is a syntax error.
来自私有属性提案的常见问题解答:
Dynamic access to private fields is contrary to the notion of 'private'.
无法动态访问私有字段是设计使然。
如果你真的想这么做。
eval(`this.#${propertyName}`)
但这只是打开了一个非常丑陋的蠕虫罐头。
另一种选择是为要动态访问的密钥设置一个私有对象:
class privateTest {
#pvt = {}
constructor(privateKey, privateVal) {
this.#pvt[privateKey] = privateVal;
}
getPrivate(privateKey) {
return this.#pvt[privateKey];
}
}
const test = new privateTest('hello', 'world');
console.log(test.getPrivate('hello')) // world