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 Zugriffs-Eigenschaft RegExp[Symbol.species]
gibt den Konstruktor zurück, der verwendet wird, um kopierte reguläre Ausdrücke innerhalb bestimmter RegExp
-Methoden zu erstellen.
Warnung:
Die Existenz von [Symbol.species]
ermöglicht die Ausführung von beliebigem Code und kann Sicherheitslücken schaffen. Sie erschwert auch bestimmte Optimierungen erheblich. Die Entwickler von JavaScript-Engines untersuchen, ob diese Funktion entfernt werden sollte. Vermeiden Sie es, sich nach Möglichkeit darauf zu verlassen.
Probieren Sie es aus
class MyRegExp extends RegExp {
// Overwrite MyRegExp species to the parent RegExp constructor
static get [Symbol.species]() {
return RegExp;
}
}
const regex1 = new MyRegExp("foo", "g");
console.log(regex1.test("football"));
// Expected output: true
Syntax
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 erstellen.
Beschreibung
Die [Symbol.species]
-Zugriffs-Eigenschaft gibt den Standard-Konstruktor für RegExp
-Objekte zurück. Konstruktoren von Unterklassen können diese überschreiben, um die Zuweisung des Konstruktors zu ändern. Die Standard-Implementierung ist im Wesentlichen:
// Hypothetical underlying implementation for illustration
class RegExp {
static get [Symbol.species]() {
return this;
}
}
Aufgrund dieser polymorphen Implementierung würde [Symbol.species]
von abgeleiteten Unterklassen standardmäßig ebenfalls den Konstruktor selbst zurückgeben.
class SubRegExp extends SubRegExp {}
SubRegExp[Symbol.species] === SubRegExp; // true
Einige RegExp
-Methoden erstellen vor der Ausführung von exec()
eine Kopie der aktuellen Regex-Instanz, damit Nebeneffekte 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 normalen Objekten
Die [Symbol.species]
-Eigenschaft gibt die Standardkonstruktionsfunktion zurück, welche der RegExp
-Konstruktor für RegExp
-Objekte ist:
RegExp[Symbol.species]; // function RegExp()
Species in abgeleiteten Objekten
In einer Instanz einer benutzerdefinierten RegExp
-Unterklasse, wie etwa MyRegExp
, ist die MyRegExp
-Species der MyRegExp
-Konstruktor. Sie könnten jedoch möchten, dies zu überschreiben, um Eltern-RegExp
-Objekte in den Methoden Ihrer abgeleiteten Klasse zurückzugeben:
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:
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® 2025 Language Specification # sec-get-regexp-%symbol.species% |
Browser-Kompatibilität
BCD tables only load in the browser