RegExp[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 July 2015.

Die statische Accessor-Eigenschaft RegExp[Symbol.species] gibt den Konstruktor zurück, der verwendet wird, um kopierte reguläre Ausdrücke in bestimmten RegExp-Methoden zu konstruieren.

Warnung: Die Existenz von [Symbol.species] erlaubt die Ausführung beliebigen Codes und kann Sicherheitslücken schaffen. Sie erschwert auch bestimmte Optimierungen erheblich. Entwickler der Engines sind dabei, zu untersuchen, ob dieses Feature entfernt werden sollte. Vermeiden Sie, sich darauf zu verlassen, wenn möglich.

Probieren Sie es aus

Syntax

js
RegExp[Symbol.species]

Rückgabewert

Der Wert des Konstruktors (this), auf dem get [Symbol.species] aufgerufen wurde. Der Rückgabewert wird verwendet, um kopierte RegExp-Instanzen zu konstruieren.

Beschreibung

Die [Symbol.species] Accessor-Eigenschaft gibt den Standardkonstruktor für RegExp-Objekte zurück. Subklassenkonstruktoren können diese überschreiben, um die Zuweisung des Konstruktors zu ändern. Die Standardimplementierung ist im Wesentlichen:

js
// Hypothetical underlying implementation for illustration
class RegExp {
  static get [Symbol.species]() {
    return this;
  }
}

Aufgrund dieser polymorphen Implementierung würde [Symbol.species] von abgeleiteten Subklassen standardmäßig auch den Konstruktor selbst zurückgeben.

js
class SubRegExp extends SubRegExp {}
SubRegExp[Symbol.species] === SubRegExp; // true

Einige RegExp-Methoden erstellen eine Kopie der aktuellen Regex-Instanz, bevor sie exec() ausführen, damit Seiteneffekte, wie Änderungen an lastIndex, nicht beibehalten werden. Die [Symbol.species]-Eigenschaft wird verwendet, um den Konstruktor der neuen Instanz zu bestimmen. Die Methoden, die die aktuelle Regex-Instanz kopieren, sind:

Beispiele

Species in gewöhnlichen Objekten

Die [Symbol.species]-Eigenschaft gibt die Standardkonstruktorfunktion zurück, die der RegExp-Konstruktor für RegExp-Objekte ist:

js
RegExp[Symbol.species]; // function RegExp()

Species in abgeleiteten Objekten

In einer Instanz einer benutzerdefinierten RegExp-Subklasse, wie MyRegExp, ist die MyRegExp-Species der MyRegExp-Konstruktor. Sie möchten dies jedoch möglicherweise überschreiben, um in Ihren abgeleiteten Klassenmethoden übergeordnete RegExp-Objekte zurückzugeben:

js
class MyRegExp extends RegExp {
  // Overwrite MyRegExp species to the parent RegExp constructor
  static get [Symbol.species]() {
    return RegExp;
  }
}

Oder Sie können dies nutzen, um den Kopiervorgang zu beobachten:

js
class MyRegExp extends RegExp {
  constructor(...args) {
    console.log("Creating a new MyRegExp instance with args:", args);
    super(...args);
  }
  static get [Symbol.species]() {
    console.log("Copying MyRegExp");
    return this;
  }
  exec(value) {
    console.log("Executing with lastIndex:", this.lastIndex);
    return super.exec(value);
  }
}

Array.from("aabbccdd".matchAll(new MyRegExp("[ac]", "g")));
// Creating a new MyRegExp instance with args: [ '[ac]', 'g' ]
// Copying MyRegExp
// Creating a new MyRegExp instance with args: [ MyRegExp /[ac]/g, 'g' ]
// Executing with lastIndex: 0
// Executing with lastIndex: 1
// Executing with lastIndex: 2
// Executing with lastIndex: 5
// Executing with lastIndex: 6

Spezifikationen

Specification
ECMAScript Language Specification
# sec-get-regexp-%symbol.species%

Browser-Kompatibilität

BCD tables only load in the browser

Siehe auch