Symbol.species

Baseline Widely available

This feature is well established and works across many devices and browser versions. It’s been available across browsers since September 2015.

Die statische Dateneigenschaft Symbol.species repräsentiert das wohlbekannte Symbol Symbol.species. Methoden, die Kopien eines Objekts erstellen, könnten dieses Symbol im Objekt nachschlagen, um die zu verwendende Konstruktorfunktion beim Erstellen der Kopie zu finden.

Warnung: Die Existenz von [Symbol.species] ermöglicht die Ausführung von beliebigem Code und kann Sicherheitslücken erzeugen. Sie erschwert auch bestimmte Optimierungen erheblich. Engine-Entwickler untersuchen, ob diese Funktion entfernt werden sollte. Vermeiden Sie es, sich nach Möglichkeit darauf zu verlassen.

Probieren Sie es aus

Wert

Das wohlbekannte Symbol Symbol.species.

Eigenschaften von Symbol.species
Schreibbarnein
Aufzählbarnein
Konfigurierbarnein

Beschreibung

Die [Symbol.species] Accessor-Eigenschaft ermöglicht es Unterklassen, den Standardkonstruktor für Objekte zu überschreiben. Dies spezifiziert ein Protokoll darüber, wie Instanzen kopiert werden sollen. Zum Beispiel, wenn Sie Kopiermethoden von Arrays verwenden, wie map(). Die map()-Methode verwendet instance.constructor[Symbol.species], um den Konstruktor für das Erstellen des neuen Arrays zu erhalten. Für weitere Informationen sehen Sie sich bitte das Thema subclassing built-ins an.

Alle eingebauten Implementierungen von [Symbol.species] geben den this-Wert zurück, welcher der Konstruktor der aktuellen Instanz ist. Dies ermöglicht es Kopiermethoden, Instanzen von abgeleiteten Klassen anstelle der Basisklasse zu erstellen — zum Beispiel wird map() ein Array desselben Typs wie das ursprüngliche Array zurückgeben.

Beispiele

Verwendung von species

Sie möchten vielleicht Array-Objekte in Ihrer abgeleiteten Array-Klasse MyArray zurückgeben. Zum Beispiel, wenn Sie Methoden wie map() verwenden, die den Standardkonstruktor zurückgeben, möchten Sie, dass diese Methoden ein Eltern-Array-Objekt zurückgeben, anstelle des MyArray-Objekts. Das species-Symbol ermöglicht Ihnen dies:

js
class MyArray extends Array {
  // Overwrite species to the parent Array constructor
  static get [Symbol.species]() {
    return Array;
  }
}
const a = new MyArray(1, 2, 3);
const mapped = a.map((x) => x * x);

console.log(mapped instanceof MyArray); // false
console.log(mapped instanceof Array); // true

Spezifikationen

Specification
ECMAScript Language Specification
# sec-symbol.species

Browser-Kompatibilität

BCD tables only load in the browser

Siehe auch