首页 > 解决方案 > WeakMap 和 JavaScript ES6 中类的私有成员有什么区别吗?

问题描述

我试图弄清楚与 WeakMap 构造函数相比,在类中定义本地/私有属性和方法有什么不同?

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

在此处输入图像描述

标签: javascriptecmascript-6

解决方案


鉴于您当前的实现:

  • let x的用处不大,因为它只能在构造函数中被引用。它不能用于任何原型方法。另一方面,WeakMap 可以在任何地方引用。这是一个相当大的区别。
  • 您的 WeakMap 可以在任何地方引用。这意味着它实际上并没有提供任何隐私。任何引用实例和 WeakMap 的东西都可以访问radius您想要私有的值。

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

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

这样,顶层只有对 的引用myClass,而不是对weakMap.

只要构造函数中只let x需要一个变量,我就会在构造函数中使用你的 - 不一定是为了隐藏数据,而只是因为它在构造函数之外没有用处。请参阅为什么限制范围是好的编程实践?

请注意,目前有一个关于可能最终实现的类字段的提案,其中包括私有字段的语法,例如:

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

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


推荐阅读