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 der Geo.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 oder weakSet 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?

InformationsquelleAutor Jared | 2017-05-20
Schreibe einen Kommentar