javascript js动态访问私有字段(属性/成员)

fzwojiic  于 2023-06-20  发布在  Java
关注(0)|答案(6)|浏览(105)

我正在尝试新的类私有成员功能🎉然而,我很快就遇到了一个问题:如何动态访问它们?
我期望它遵循预先存在的语法

constructor(prop, val) {
  this[`#${prop}`] = val; // undefined
}

constructor(prop, val) {
  this.#[prop] = val; // syntax error
}

然而,上述两种方法都失败了。

7hiiyaii

7hiiyaii1#

另一种选择是为您想要动态访问的密钥创建一个私有对象:

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
4dbbbstv

4dbbbstv2#

我不认为你可以动态地访问私有字段。该提案称:
没有私有计算属性名称:#foo是私有标识符,#[foo]是语法错误。

new9mtju

new9mtju3#

如果你真的想做的话。

eval(`this.#${propertyName}`)

但这只是打开了一个非常丑陋的蠕虫罐。

xytpbqjk

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
缺少对私有字段的动态访问是设计使然。

js4nwp54

js4nwp545#

不能动态访问私有字段。获取动态私有字段的一种方法是使用Symbols。
符号是标量,就像字符串一样。您可以创建这样的符号:

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.
    }

}

更多关于Symbols

  • Symbol.for()函数与Symbol()函数不同,但都返回一个符号。
  • 查看Symbols的MDN文档
  • 和一个article here
gz5pxeao

gz5pxeao6#

私有字段和方法可以动态访问,如果你有一些幻想!
所以,你的类中有两个私有方法

#media(method) {
    return ({
      import: this.#import.bind(this),
    }[method](method))
  }
  
  #import(method) {
    alert(this.#media)
    return {method: '@' + method}
  }

在这种情况下,你可以像这样调用#import:

this.#media('import')

注意,如果要使用this作为内部的类指针,请使用bind(this)设置#import的正确作用域。

相关问题