此代码有效:
class Test {
#field
get field() {
return this.#field;
}
}
但如果我想计算字段名,我必须使用方括号,但它不起作用:
class Test {
#field;
get field() {
return this['#field'];
}
}
有什么方法可以获得具有计算名称的私有字段吗?
移交一个具有特殊含义的字符串似乎是个问题。
如果真的有必要,可以计算字符串。
class Test {
#field = 'foo';
get field() {
return eval('this.' +'#field');
}
}
console.log(new Test().field)
这是不可能的。来自提案:
没有私有计算属性名:
#foo
是私有标识符,#[foo]
是语法错误。
及其常见问题解答:
既然
this.#x
访问名为#x
的私有字段,为什么this['#x']
不访问
这会使属性访问语义复杂化。
对私有字段的动态访问与"私有"的概念相反。例如,这涉及:
class Dict extends null { #data = something_secret; add(key, value) { this[key] = value; } get(key) { return this[key]; } } (new Dict).get('#data'); // returns something_secret
但是,赋予
this.#x
和this['#x']
不同的语义难道不打破当前语法的不变吗不完全是这样,但这是一个令人担忧的问题。
this.#x
以前从未法律语法,所以从一个角度来看,不可能有不变量另一方面,它们的不同可能令人惊讶是当前提案的不利方面。
另请参阅此问题。