如何用Symbol声明一个真正的#private字段?

问题描述 投票:0回答:1

我尝试在ES6+类中声明私有Symbol属性,下面的方法都是错误的。

class MyClass {
  #[Symbol.for('my-symbol-prop1')] = 'my-symbol-prop1';  // SyntaxError
  [#Symbol.for('my-symbol-prop1')] = 'my-symbol-prop1';  // SyntaxError
}

我的问题:有没有办法声明一个真正的私有Symbol属性,只需使用像

#myPrivateSymbolfield
这样的哈希符号,不要使用
WeakMap
enclosure approach

javascript class symbols private
1个回答
0
投票

目前在 JavaScript 中,没有直接的方法可以使用私有字段语法 (#) 创建私有 Symbol 属性。私有字段功能和符号属性有不同的用途。话虽如此,您可以轻松地解决相同的问题,即使用私有字段来存储符号,如代码片段所示:

class MyClass {
  [Symbol.for('my-symbol-prop')] = 'symbol';
  
  // Private Symbol wokraround using private field
  #privateSymbol = Symbol('privateSymbol Desc');
  
  constructor() {
    // The Symbol itself can be accessed via the getter
    // but the property using this Symbol is still private
    this[this.#privateSymbol] = 'private symbol value';
  }
  
  // Getter to access the private symbol value
  get privateSymbolValue() {
    return this[this.#privateSymbol];
  }
}

const instance = new MyClass();
console.log(instance.privateSymbolValue);

© www.soinside.com 2019 - 2024. All rights reserved.