javascript - 在运行时选择私有(private)字段

标签 javascript private

有了公共(public)领域,我可以这样做:

class Smth {
  a = 0
  b = 0

  constructor(value, isA) {
    this[isA ? 'a' : 'b'] = value
  }
  
  toString() {
    return `(${this.a}, ${this.b})`
  }
}

console.log(new Smth(1, true) + "")
console.log(new Smth(2, false) + "")

我可以将什么等价物用于私有(private)字段?

我只看到带有eval 的解决方案:

class Smth {
  #a = 0
  #b = 0

  constructor(value, isA) {
    eval(`this.#${isA ? 'a' : 'b'} = value`)
  }
  
  toString() {
    return `(${this.#a}, ${this.#b})`
  }
}

console.log(new Smth(1, true) + "")
console.log(new Smth(2, false) + "")

或完全分支到 if-else 的解决方案:

class Smth {
  #a = 0
  #b = 0

  constructor(value, isA) {
    if (isA) {
      this.#a = value
    } else {
      this.#b = value
    }
  }
  
  toString() {
    return `(${this.#a}, ${this.#b})`
  }
}

console.log(new Smth(1, true) + "")
console.log(new Smth(2, false) + "")

这两种解决方案都不适合我。


如果没有这种方式,我想知道为什么。

很明显 this['#x'] 是完全不同的东西。但是有很多方法可以用其他语法来表达需要的东西,比如:

this.#[true ? 'x' : 'y']
this[true ? #x : #y]
this.#[true ? #x : #y]
this.#(true ? ##x : ##y)

还有很多其他的。为什么不呢?

最佳答案

Source

There are no private computed property names: #foo is a private identifier, and #[foo] is a syntax error.

Why doesn't this['#x'] access the private field named #x, given that this.#x does?

要解决这个问题,您需要使用 if/else 语句并以非动态方式设置每个语句:

class Smth {
  #a = 0
  #b = 0

  constructor(value, isA) {
    isA ? (this.#a = value) : (this.#b = value)
  }
  
  toString() {
    return `(${this.#a}, ${this.#b})`
  }
}

console.log(new Smth(1, true) + "")
console.log(new Smth(2, false) + "")

关于javascript - 在运行时选择私有(private)字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57661515/

相关文章:

c++ - 作为类成员的函数的定义

C++ 保留对象列表并通过另一个函数调用构造函数

javascript - Video.js - 使用 Flash 在单个页面上显示多个 mp4 视频

javascript - 访问 JSON 字符串时出现类型错误

java - 创建对象时,左侧类表示什么,右侧类表示什么?

c++ - C++ 私有(private)函数的内部链接?

javascript - 未授权用户的单独页面或同一页面的不同配置?

php - 如何使用 Console Chrome 在 Facebook 中从 jQuery.post 发送和接收数据

javascript - 如何将输入目标值和 setState 值作为参数传递给辅助函数?

javascript - Javascript 文字对象中的私有(private)变量