我正在尝试使用新的类私有成员特性,但是很快就遇到了一个问题:如何动态访问它们?
我预期它会遵循现有的语法,采用以下方式之一
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
}
然而,上述两种方法都失败了。
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
eval(`this.#${propertyName}`)
但那只是开启了一个非常棘手的问题。
来自有关私有属性提案的常见问题解答:
动态访问私有字段与“私有”概念相违背。
故意设计了不能动态访问私有字段。
私有字段无法动态访问。 获取动态私有字段的一种方法是使用符号。
符号是一个标量,就像字符串一样。 您可以这样创建符号:
let myXyzSymbol = Symbol('my_xyz_symbol');
// note the absence of `new`
false
:Symbol('x') === Symbol('x')
const mySym = Symbol('foo');
export class Something {
[mySym]() {
// This function can not be called by
// a caller that does not have access to mySym.
}
}
更多关于符号的内容
#media(method) {
return ({
import: this.#import.bind(this),
}[method](method))
}
#import(method) {
alert(this.#media)
return {method: '@' + method}
}
this.#media('import')
this[\
#${prop}`]只会设置一个普通属性,因为无法判断它是作为私有属性还是包含
#的常规合法属性名。至于 [tc39 提案](https://github.com/tc39/proposal-class-fields/blob/master/README.md#private-syntax) 中的
#[prop]` 被认为是语法错误,因为它们没有计算属性名称。因此,在当前阶段可能无法进行动态访问。 - Patrick Evans#
只是名称的一部分,所以基于此,我认为连接应该可以正常工作。 - Jakob Jingleheimer