【问题标题】:How to get access to private field via square brackets in JavaScript如何通过 JavaScript 中的方括号访问私有字段
【发布时间】:2020-09-01 19:21:39
【问题描述】:

此代码有效:

class Test {
  #field

  get field() {
    return this.#field;
  }
}

但如果我想计算字段名,我必须使用方括号,但它不起作用:

class Test {
  #field;

  get field() {
    return this['#field'];
  }
}

有什么方法可以获取具有计算名称的私有字段?

【问题讨论】:

  • “计算出来的名字”是什么意思?您的示例使用的是静态字符串。
  • 这很可能是演示问题的实际代码的抽象。我想知道 OP 使用的垫片是否记录了这种行为。看起来这是一个具有多种实现的proposal。你用的是什么环境?
  • 私有类成员的# 仍处于试验阶段,不应用于生产系统。 (Firefox 不支持它)另外,它不打算在[] 中使用。如果你想拥有动态字段,你可以做this.#fields['myfield'];,其中#fields被声明为#fields = {field1: 1, field2: "a"};
  • 引用proposal:“没有私有计算属性名称:#foo 是私有标识符,#[foo] 是语法错误。”

标签: javascript private class-fields


【解决方案1】:

看来要交出一个有特殊含义的字符串是个问题。

如果真的有必要,你评估一个字符串。

class Test {
    #field = 'foo';

    get field() {
        return eval('this.' +'#field');
    }
}

console.log(new Test().field)

【讨论】:

    【解决方案2】:

    这是不可能的。来自proposal

    没有私有计算属性名称:#foo 是私有标识符,#[foo] 是语法错误。

    its FAQ:

    既然this.#x 可以,为什么this['#x'] 不访问名为#x 的私有字段?

    1. 这会使属性访问语义复杂化。

    2. 对私有字段的动态访问与“私有”的概念相反。例如。这是关于:

    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.#xthis['#x'] 不同的语义不会破坏当前语法的不变量吗?

    不完全是,但这是一个问题。 this.#x 以前从未有过 合法的语法,所以从一个角度来看,不可能有不变量 关于它。

    另一方面,它们的不同可能令人惊讶,而这 是当前提案的缺点。

    另见this issue

    【讨论】:

      猜你喜欢
      • 2013-12-17
      • 2021-12-15
      • 1970-01-01
      • 2011-04-03
      • 2015-07-08
      • 2010-11-09
      • 2012-06-07
      • 2018-12-31
      • 2011-10-01
      相关资源
      最近更新 更多