Несколько частных свойств в JavaScript с WeakMap - PullRequest
2 голосов
/ 03 марта 2020

Я хочу установить свои свойства класса закрытыми, поэтому я использовал WeakMap, но с одним WeakMap. После создания элементов я получаю только последние данные объекта, предыдущие данные удаляются ...

Это определение моего кода:

const Item = (() => {
  const weakMap = new WeakMap();
  const _id = {};
  const _text = {};

  class Item {
    constructor({id, text}) {
      weakMap.set(_id, {id});
      weakMap.set(_text, {text});
    }

    getId() {
      return weakMap.get(_id).id;
    }

    getText() {
      return weakMap.get(_text).text;
    }
  }

  return Item;
})();

Здесь я создаю массив со всеми своими элементами :

const items = myItems.map(item => {
  const newItem = new Item(item);
  console.log('new item created, id: ' + newItem.getId());
  return newItem;
});

Элементы хорошо созданы, я получаю:

new item created, id: 1
new item created, id: 2
new item created, id: 3
new item created, id: 4

Но когда я перебираю свои элементы, я получаю:

items.forEach(element => console.log(element.getId() + ' ' + element.getText()));

4 Fourth description
4 Fourth description
4 Fourth description
4 Fourth description

Это живой пример: https://plnkr.co/edit/pFCOcCVl1AQEJqSKvfVX

Также с закрытием это не работает:

const Answer = (() => {
  const weakMap = new WeakMap();
  const _id = {};
  const _text = {};

  class Answer {
    getId;
    getText;

    constructor({id, text}) {
      weakMap.set(_id, {id});
      weakMap.set(_text, {text});

      this.getId = () => weakMap.get(_id).id;
      this.getText = () => weakMap.get(_text).text;
    }
  }
}

1 Ответ

2 голосов
/ 03 марта 2020

Если вы используете WeakMap для реализации частных свойств, ключом на карте обычно является сам объект / экземпляр. Значение является объектом, который содержит все частные свойства.

const Item = (() => {
  const weakMap = new WeakMap();

  class Item {
    constructor({id, text}) {
      const privateData = {id, text};
      weakMap.set(this, privateData);
    }

    getId() {
      return weakMap.get(this).id;
    }

    getText() {
      return weakMap.get(this).text;
    }
  }

  return Item;
})();
...