我正在尝试新的类私有成员功能🎉然而,我很快就遇到了一个问题:如何动态访问它们?
我期望它遵循预先存在的语法
constructor(prop, val) {
this[`#${prop}`] = val; // undefined
}
或
constructor(prop, val) {
this.#[prop] = val; // syntax error
}
然而,上述两种方法都失败了。
我正在尝试新的类私有成员功能🎉然而,我很快就遇到了一个问题:如何动态访问它们?
我期望它遵循预先存在的语法
constructor(prop, val) {
this[`#${prop}`] = val; // undefined
}
或
constructor(prop, val) {
this.#[prop] = val; // syntax error
}
然而,上述两种方法都失败了。
6条答案
按热度按时间7hiiyaii1#
另一种选择是为您想要动态访问的密钥创建一个私有对象:
4dbbbstv2#
我不认为你可以动态地访问私有字段。该提案称:
没有私有计算属性名称:
#foo
是私有标识符,#[foo]
是语法错误。new9mtju3#
如果你真的想做的话。
但这只是打开了一个非常丑陋的蠕虫罐。
xytpbqjk4#
关于私有财产的常见问题:
对私有字段的动态访问与“私有”的概念相反。
https://github.com/tc39/proposal-private-fields/blob/master/FAQ.md#why-doesnt-thisx-access-the-private-field-named-x-given-that-thisx-does
缺少对私有字段的动态访问是设计使然。
js4nwp545#
不能动态访问私有字段。获取动态私有字段的一种方法是使用Symbols。
符号是标量,就像字符串一样。您可以创建这样的符号:
符号总是唯一的。这意味着以下始终是
false
:现在,我们有了所有的部件来做一些关于动态私人的事情。
创建符号,但不要将其导出到模块之外。这使它私人。
更多关于Symbols
Symbol.for()
函数与Symbol()
函数不同,但都返回一个符号。gz5pxeao6#
私有字段和方法可以动态访问,如果你有一些幻想!
所以,你的类中有两个私有方法:
在这种情况下,你可以像这样调用#import:
注意,如果要使用this作为内部的类指针,请使用bind(this)设置#import的正确作用域。