ES6-Klassen - Update-Statische Eigenschaften
Ich versuche herauszufinden, alternative Möglichkeiten, um eine statische (oder eine Klasse) die Eigenschaft einer ES6-Klasse und klicken Sie dann auf ändern, nachdem Sie neue Instanzen der Klasse erstellt werden.
Zum Beispiel, sagen wir ich habe eine Klasse namens Geo
, und ich brauche eine statische Eigenschaft namens all
gibt mir das array aller Instanzen des Geo
Klasse.
Diese version funktioniert:
class Geo {
constructor(name){
this.name = name;
Geo.all.push(this);
}
}
Geo.all = [];
ruby = new Geo("Ruby");
rocks = new Geo("Rocks");
console.log(Geo.all.length); //=> 2
Ich würde lieber nicht setzen Sie die Eigenschaft AUßERHALB der Klassendefinition obwohl. Ich habe versucht, ein paar Dinge, aber kann nicht scheinen, um erstellen Sie eine statische Eigenschaft in die Klasse, ich kann das update aus dem Konstruktor.
Sollte ich auch erwähnen, dass ich in der Lage sein müssen, dies zu tun im browser (Chrome) ohne Verwendung von Babel oder ähnliches.
Hier sind ein paar Beispiele Dinge, die ich versucht habe:
class Geo {
constructor(name){
this.name = name;
Geo.all.push(this);
}
static get all() {
return [];
}
}
ruby = new Geo("Ruby");
rocks = new Geo("Rocks");
console.log(Geo.all.length); //=> 0
Und anderen
class Geo {
constructor(name){
this.name = name;
Geo.all.push(this);
}
static all = [];
}
ruby = new Geo("Ruby");
rocks = new Geo("Rocks");
console.log(Geo.all.length); //=> error unexpected "="
- Es gibt keinen anderen Weg in ES6 zu tun.
- Was ist falsch mit
Geo.all = []
? - Sollten Sie nicht über eine Globale Sammlung von Instanzen - dies führt zu memory-leaks und Modularisierung (z.B. Testbarkeit) Probleme
- Sie konnte tun
Geo.all = (Geo.all || []).concat(this);
innerhalb der Konstruktor-Funktion. Die statische Initialisierung außerhalb der Klasse definition ist jedoch die "idiomatischen" standard-Weg, um dieses Problem zu lösen. Es garantiert zudem die Existenz derGeo.all
noch bevor die erste Instanz erstellt wird. - Verstehen Sie, dass eine statische Eigenschaft ist ein Wert für alle Instanzen. Es ist die Eigenschaft einer Klasse, nicht einer Instanz-Eigenschaft. Wenn Sie möchten, erstellen Sie eine Instanz-variable von einer statischen Eigenschaft, Sie können kopieren Sie die static-Eigenschaft auf eine Instanz-Eigenschaft zu welcher Zeit Sie wollen, packen Sie die statische Eigenschaft-Wert und dann ab auf die Instanz-Eigenschaft beibehalten wird separat auf diese Instanz. Aber in einer Klasse eine Eigenschaft hat nur einen Wert für alle Instanzen.
- Wenn Sie möchten, um zu verfolgen alle Instanzen eines bestimmten Objekts, dann Sie wahrscheinlich nicht wollen, um Sie in einem array, denn das führt wahrscheinlich zu memory leaks, weil damit zwingt Ihr code, um Speicher zu verwalten, die für jedes Objekt (Sie müssen manuell entfernen Sie es von der Reihe, damit es vom garbage collector freigegeben, womit viel von der Nützlichkeit der garbage collection). Sie konnte, legte Sie in einen
weakMap
oderweakSet
je nachdem, wie Sie wollen in der Lage sein, um Ihnen den Zugang und, dass töten nicht die garbage collection. - Was ist falsch mit etwas zu tun, wie das erstellen einer variable mit dem Namen GeoInstances, abgesehen von der Klasse, und verwenden Sie diese? Die Klasse sollte, wie diese Variablen existieren innerhalb der eigenen Möglichkeiten (nicht den globalen scope). So wird es den privaten um den block, es gibt Sie in. In der Tat: warum dann nicht einfach die Geo.alle?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Gibt es keine solche Sache wie
static all = []
im ES6. Klasse Beispiel und statische Felder sind derzeit Stufe 3 Vorschläge, die verwendet werden können, über ein transpiler, z.B. Babel. Es gibt bereits bestehende Umsetzung in Maschinenschrift, die möglicherweise nicht kompatibel mit diese Vorschläge, die in irgendeiner Weise, nochstatic all = []
ist gültig in TS und ES.Neben.gültig ist und bevorzugte Art und Weise, dies zu tun in ES6. Die alternative ist die getter - /setter-paar - oder nur einen getter für nur-lese-Eigenschaft:
Tracking-Instanzen in der statischen Eigenschaft kann im Allgemeinen nicht als gutes Muster und führen zu unkontrollierbaren Speicher-Verbrauch und-Leckagen (wie es bereits erwähnt wurde in den Kommentaren).
Dies funktioniert für mich für die statischen Eigenschaften.
Und Ihr Beispiel:
Hinweis: In der getter-Sie könnte auch überprüfen Sie für die Existenz der Eigenschaft, die über die
in
Schlüsselwort oder diehasOwnProperty
Stichwort.Und mit
hasOwnProperty
:Ich hatte vor kurzem ein ähnliches Thema erstellen von statischen Klassen.
Zuerst habe ich versucht es mit Konstanten Klassenvariablen, aber Chrome debugger warf einen Fehler.
So definierte ich die class-Variablen 'static', auch die getter-Methoden.
Arbeitete in Chrom.
JS: