2017-08-30 2 views
1

Ich möchte das Objekt aus dem Speicher entfernt werden, wenn Verweise darauf in der Anwendung nicht verwendet werden. Wenn jedoch die Links in der Anwendung vorhanden sind und wir versuchen, ein Objekt mit derselben ID zu erstellen, geben Sie dieses Objekt zurück, anstatt ein neues Objekt zu erstellen. Wie kann ich es ohne Destruktoren machen?WeakMap Muster Singleton ohne Speicherleck

Aber wenn alle Referenzen auf das Objekt aus der Anwendung verschwinden und Objekt aus dem Speicher entfernt, dann gibt es nichts Schlimmes eine neue Instanz des Objekts

+0

so, wenn es keine Referenz auf ein 'Cat' Objekt mit der ID' c1' in der Anwendung, was wollen Sie? entferne es von der Karte und erzeuge das nächste Mal ein neues Objekt mit 'new Cat (" c1 ")'? –

+0

@Koushik Chatterjee Ja, es ist immer notwendig, dass Objekte mit einer eindeutigen ID das gleiche Objekt sind/Wenn jedoch alle Verweise auf das Objekt aus der Anwendung verschwinden und das Objekt aus dem Speicher entfernt wird, ist es nicht schlecht, eine neue Instanz zu erstellen des Objekts – Maxmaxmaximus

+0

Läuft dies in Node oder Browser? –

Antwort

0

Javascript nicht unterstützt diese Funktion zu erstellen. Ich habe einen Workaround gefunden:

Bei jeder Objektkonstruktion erhöhen wir die Anzahl der Links um eins, und mit jeder Destrukturierung reduzieren wir die Anzahl der Links um eins. Wenn die Anzahl der Verknüpfungen null ist, löschen wir das Objekt manuell aus dem Speicher.

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

} 

Nutzung:

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

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