2

クラス プロパティをプライベートに設定したいので、WeakMap を使用しましたが、WeakMap は 1 つだけでした。アイテムの作成後、最後のオブジェクト データのみを取得し、以前のデータは削除されます...

これは私のコード定義です:

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;
    }
  }
}
4

1 に答える 1

2

を使用し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;
})();
于 2020-03-03T14:01:25.537 に答える