ES6 WeakMap Класс инкапсуляции - PullRequest
0 голосов
/ 28 мая 2018

Я пытаюсь понять, почему мне нужно использовать WeakMaps для создания закрытых членов класса, а не просто с помощью обычной переменной.Они оба создают инкапсуляцию с замыканиями и импортируют модули.

(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!

1 Ответ

0 голосов
/ 28 мая 2018

Проблема с обычной переменной, такой как 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...