1

此代码有效:

class Test {
  #field

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

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

class Test {
  #field;

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

有没有办法获得具有计算名称的私有字段?

4

2 回答 2

1

看起来传递具有特殊含义的字符串是一个问题。

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

class Test {
    #field = 'foo';

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

console.log(new Test().field)

于 2020-09-01T19:42:13.743 回答
1

这是不可能的。来自提案

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

及其常见问题解答

既然如此,为什么不this['#x']访问名为 的私有字段?#xthis.#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.#x但是,不同的语义不会this['#x']破坏当前语法的不变性吗?

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

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

另请参阅此问题

于 2020-09-01T20:27:47.490 回答