WeakMap和JavaScript ES6中的类的私有成员之间有什么区别?

时间:2019-05-07 08:18:42

标签: javascript ecmascript-6

我试图找出与WeakMap构造函数相比,在类中定义本地/私有属性和方法之间的区别是什么?

将它们从外面隐藏的目的是相同的还是使用其他东西?

enter image description here

1 个答案:

答案 0 :(得分:1)

鉴于您当前的实施方式:

  • 您的let x并不是很有用,因为只能在构造函数中引用它。不能在任何原型方法中使用。另一方面,WeakMap可以在任何地方引用。这是一个很大的差异。
  • 您的WeakMap可以在任何地方引用。这意味着它实际上并没有提供任何隐私。引用实例的任何内容,WeakMap可能会访问您想要私有的radius值。

如果希望WeakMap通过闭包适当地私有,则可以使用IIFE定义类,例如:

const myClass = (() => {
  const weakMap = new WeakMap();
  return class Circle {
    // etc
})();

这样,顶层仅引用myClass,而不引用weakMap

只要在构造函数中仅需要变量 ,我就会在构造函数中使用您的let x-不一定是隐藏数据的 s ,而只是因为它在构造函数之外没有用。参见Why is it good programming practice to limit scope?

请注意,目前class fields的提案可能会最终实施,其中包括专用字段的语法,例如:

class Circle {
  constructor(radius) {
    this.#x = radius;
    // ...

这将允许从#x内的任何地方访问Circle,但无其他地方。它在功能上等效于WeakMap实现。