javascript - ES6 WeakMap 类封装

标签 javascript class ecmascript-6

我试图理解为什么我需要使用 Wea​​kMaps 来创建私有(private)类成员,而不是仅仅使用普通变量。它们都使用闭包和模块导入创建封装。

(function encapsulation() {
  const my_var = 'My secret info';
  const my_var2 = new WeakMap();

  class Test {
    constructor() {
      my_var2.set(this, 'My secret info 2');
      console.log(my_var); // My secret info
      console.log(my_var2.get(this)); // My secret info 2
    }
  }

  const t = new Test();
})();


console.log(my_var); // undefined
console.log(my_var2); // undefined

// Same result!

最佳答案

my_var 这样的普通变量的问题是它只会保存类的单个实例化的数据:

const Test = (function encapsulation() {
  let my_var = 'My secret info';

  class Test {
    constructor(param) {
      my_var = param;
    }
    getInfo() {
      return my_var;
    }
  }
  return Test;
})();

const t1 = new Test('foo');
const t2 = new Test('bar');
console.log(t1.getInfo());
// the above returns 'bar'... uh oh, but we passed in 'foo' to `t1`! Our data is lost!
console.log(t2.getInfo()); // 'bar'

因此,需要一个 WeakMap 来为每个实例化保存单独的数据:

const Test = (function encapsulation() {
  const my_var2 = new WeakMap();

  class Test {
    constructor(param) {
      my_var2.set(this, param);
    }
    getInfo() {
      return my_var2.get(this);
    }
  }
  return Test;
})();

const t1 = new Test('foo');
const t2 = new Test('bar');
console.log(t1.getInfo()); // 'foo', as expected
console.log(t2.getInfo()); // 'bar', as expected

关于javascript - ES6 WeakMap 类封装,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50565295/

相关文章:

javascript - socket.io聊天示例代码中fn()的含义

c++ - 删除不同线程中的对象会导致崩溃?

javascript - 用无限可选参数包装console.log

javascript - TypeScript 和 JavaScript : Communicate using events with content

javascript - 将 onDisconnect 与 Firebase 中的云功能相结合

javascript - 如何在 TypeScript 中指定字符数组

javascript - 我如何在 3CX 中使用 sipml5?

C++私有(private)类动态n维数组

Python 子类

javascript - 视频没有开始播放,而是抛出 DOMException