1
class Cat {

  storage = new Map()  

  constructor(id) {
    if(storage.has(id)) return storage.get(id)
    storage.set(id, this)
  }

}

オブジェクトへの参照がアプリ​​ケーションで使用されていない場合、オブジェクトをストレージから削除したい。ただし、アプリケーションにリンクが存在し、同じ ID のオブジェクトを作成しようとしている場合は、新しいオブジェクトを作成するのではなく、このオブジェクトを返します。デストラクタなしでそれを行うにはどうすればよいですか?

しかし、オブジェクトへのすべての参照がアプリ​​ケーションから消え、オブジェクトがストレージから削除された場合、オブジェクトの新しいインスタンスを作成することは悪いことではありません

4

1 に答える 1

0

Javascript はこの機能をサポートしていません。私は回避策を思いつきました:

オブジェクトを構築するたびに、リンクの数を 1 ずつ増やし、分解するたびに、リンクの数を 1 ずつ減らします。リンクの数がゼロの場合は、オブジェクトをストレージから手動で削除します。

class Cat {

  storage = {}


  constructor(id) {
    if(storage[id]) {
      var cat = storage[id]
      cat.links++
      return cat
    }

    storage[id] = this
    this.links = 1
  }


  destroy() {
    if(--this.links) {
      delete storage[this._id]
    }
  }

}

利用方法:

cat1 = new Cat('id')
cat2 = new Cat('id')

cat1 === cat2 // true
cat1.destroy() // storage NOT empty
cat2.destroy() // storage is empty
于 2017-08-30T16:31:11.953 に答える