2017-08-30 1 views
1
class Cat { 

    storage = new Map() 

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

} 

Je souhaite que l'objet soit retiré du stockage si les références ne sont pas utilisées dans l'application. Mais si les liens de l'application existent et que nous essayons de créer un objet avec le même ID, renvoyez cet objet plutôt que d'en créer un nouveau. Comment je peux le faire sans destructeurs?WeakMap Pattern Singleton sans fuite de mémoire

Mais quand toutes les références à l'objet disparaissent de l'application et de l'objet retiré du stockage, alors il n'y a rien de mal à créer une nouvelle instance de l'objet

+0

donc quand il n'y a pas de référence à un c1' objet 'Cat' avec id' dans l'application, que voulez-vous? le retirer de la carte et la prochaine fois créer un nouvel objet avec 'new Cat (" c1 ")'? –

+0

@Koushik Chatterjee oui, il est toujours nécessaire que les objets avec id unique soient le même objet/Mais quand toutes les références à l'objet disparaissent de l'application, et l'objet retiré du stockage, il n'y a rien de mal à créer une nouvelle instance de l'objet – Maxmaxmaximus

+0

Est-ce que cela fonctionne dans Node ou les navigateurs? –

Répondre

0

Javascript prennent pas en charge cette fonctionnalité. Je suis venu avec une solution de contournement:

À chaque construction d'objet, nous augmentons le nombre de liens par un, et à chaque déstructuration nous réduisons le nombre de liens par un. et quand le nombre de liens est nul, nous supprimons manuellement l'objet du stockage.

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] 
    } 
    } 

} 

utilisation:

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

cat1 === cat2 // true 
cat1.destroy() // storage NOT empty 
cat2.destroy() // storage is empty