Wie kann ich die Instanzen eines Objekts zählen?

7

Wenn ich ein Javascript-Objekt wie folgt definiert habe:

%Vor%

Jetzt kann ein Benutzer es wie folgt nennen:

%Vor%

So weit so gut, und man kann auch im selben Code eine andere Instanz davon ausführen:

%Vor%

Nun möchte ich wissen, wie ich die Anzahl der Instanzen MyObj halten kann? Gibt es eine eingebaute Funktion?

Eine Möglichkeit, die ich mir vorstelle, ist, eine globale Variable zu inkrementieren, wenn MyObj initialisiert wird, und das ist der einzige Weg, diesen Zähler im Auge zu behalten. Aber gibt es etwas Besseres als diese Idee?

BEARBEITEN:

Sehen Sie sich dies hier als Vorschlag an:

Ich meine, wie kann ich es auf 2 statt auf 3 zurückkommen lassen.

    
Johnydep 11.09.2012, 22:35
quelle

6 Antworten

13

Es ist nichts eingebaut; Sie können jedoch Ihre Konstruktorfunktion die Anzahl der Aufrufe beibehalten. Leider bietet die JavaScript-Sprache keine Möglichkeit, festzustellen, ob ein Objekt den Gültigkeitsbereich verlassen hat oder ob es sich bei der Datenbereinigung um einen Fehler handelt. Ihr Zähler wird also nur nach oben und nicht nach unten gehen.

Zum Beispiel:

%Vor%

Natürlich, wenn Sie verhindern möchten, dass die Zählung manipuliert wird, sollten Sie den Zähler über eine Schließung verstecken und eine Accessor-Funktion zum Lesen bereitstellen.

[Bearbeiten]

Je nach aktualisierter Frage gibt es keine Möglichkeit, nachzuverfolgen, wann Instanzen nicht mehr verwendet oder "gelöscht" werden (z. B. durch Zuweisen von null zu einer Variablen), da JavaScript keine Finalizer-Methoden für Objekte.

Das Beste, was Sie tun können, ist eine "dispose" -Methode zu erstellen, die Objekte aufrufen, wenn sie nicht mehr aktiv sind (zB durch eine Referenz Zählen Schema), aber das erfordert Zusammenarbeit des Programmierers - die Sprache bietet keine Hilfe:

%Vor%     
maerics 11.09.2012 22:39
quelle
3

Erstellen Sie eine statische Eigenschaft für den MyObj -Konstruktor namens say count und inkrementieren Sie sie im Konstruktor selbst.

%Vor%

Dies ist die Art, wie Sie es normalerweise in Java tun würden (mit einer statischen Eigenschaft).

    
Aadit M Shah 11.09.2012 22:45
quelle
2
%Vor%     
Ignacio Martínez 17.12.2015 16:03
quelle
1

Was ist mit einer solchen Methode?

%Vor%     
volod 24.12.2014 12:56
quelle
0

Schließlich wird JS eine eingebaute Proxy-Funktion haben, die auf niedriger Ebene Zugriff auf alle Arten von Dingen hat, die im Hintergrund passieren, die niemals Front-End-Entwicklern zugänglich gemacht werden (außer durch den Proxy - - Denk magische Methoden in Sprachen wie PHP).

Zu diesem Zeitpunkt könnte das Schreiben einer Destruktor-Methode für Ihr Objekt, die den Zähler dekrementiert, völlig trivial sein, solange die Unterstützung für die Destruction / Garbage-Collection als Trigger zu 100% plattformübergreifend gewährleistet ist.

Die einzige Möglichkeit, dies zu tun, ist derzeit, dass Sie eine geschlossene Registrierung aller erstellten Instanzen erstellen und diese dann manuell löschen können (andernfalls werden sie NIEMALS unbemerkt gesammelt).

%Vor%

Wird dieses Muster tun, was Sie wollen? Solange:

  1. Sie machen a nicht zu etwas anderem
  2. Überschreiben Sie nicht die Methode explode
  3. verwirren Sie nicht mit Obj in irgendeiner Weise
  4. Sie erwarten nicht, dass prototype -Methode Zugriff auf eine der internen Variablen hat

... dann wird diese Methode gut funktionieren, damit der Zähler richtig funktioniert. Sie könnten sogar eine allgemeine Methode namens recycle schreiben, die die explode -Methode jedes Objekts aufruft, das Sie übergeben (solange der Konstruktor oder die Factory dies unterstützt).

%Vor%

Hinweis - das wird das Objekt nicht wirklich los. Sie haben es nur aus der Schließung entfernt und alle Methoden / Eigenschaften entfernt, die es einmal hatte.

Jetzt ist es eine leere Hülle, die Sie wiederverwenden können, die nach dem Recycling ihrer Teile ausdrücklich auf null gesetzt wird, oder lassen Sie sie sammeln und vergessen Sie sie, in dem Wissen, dass Sie notwendige Referenzen entfernt haben.

War das nützlich? Wahrscheinlich nicht.

Das einzige Mal, wenn ich das wirklich als nützlich erachte, wäre ein Spiel, in dem dein Charakter nur 3 Kugeln gleichzeitig abfeuern darf und er kein 4. schießen kann, bis der erste auf dem Bildschirm jemanden trifft oder geht von der Kante (so, sagen wir, Contra, arbeitete am Tag).

Sie können auch einfach eine "verschwundene" Kugel vom Stapel entfernen und diese Kugel für jeden Spieler / Feind wiederverwenden, indem Sie ihre Flugbahn zurücksetzen, entsprechende Flaggen zurücksetzen und auf den Stapel zurückschieben.

Aber bis Proxys es uns erlauben, "magische" Konstruktor / Destruktor-Methoden zu definieren, die auf niedriger Ebene geehrt werden, ist dies nur nützlich, wenn Sie die Erstellung und Vernichtung aller Ihrer eigenen Objekte mikromantieren (wirklich keine gute Idee).

    
Norguard 11.09.2012 23:40
quelle
0

Meine Lösung erstellt einen Objektspeicherinstanzzähler und eine Funktion, um sie im Prototyp zu erhöhen.

%Vor%

Hier ist mein Schatz: Ссылка

    
tainguyen723 12.09.2016 06:55
quelle

Tags und Links