RegExp[Symbol.species]
Baseline
Large disponibilité
Cette fonctionnalité est bien établie et fonctionne sur de nombreux appareils et versions de navigateurs. Elle est disponible sur tous les navigateurs depuis septembre 2016.
La propriété accesseur statique RegExp[Symbol.species] retourne le constructeur utilisé pour construire des expressions rationnelles copiées dans certaines méthodes de RegExp.
Attention :
L'existence de [Symbol.species] permet l'exécution de code arbitraire et peut créer des vulnérabilités de sécurité. Elle rend également certaines optimisations beaucoup plus difficiles. Les concepteur·ice·s de moteurs étudient la possibilité de supprimer cette fonctionnalité (angl.). Évitez de vous y fier si possible.
Syntaxe
RegExp[Symbol.species]
Valeur de retour
La valeur du constructeur (this) sur lequel get [Symbol.species] a été appelé. La valeur de retour est utilisée pour construire des instances copiées de RegExp.
Description
L'accesseur [Symbol.species] retourne le constructeur par défaut pour les objets RegExp. Les constructeurs des sous-classes peuvent le surcharger pour modifier l'affectation du constructeur. L'implémentation par défaut est essentiellement la suivante :
// Implémentation sous-jacente hypothétique à titre d'illustration
class RegExp {
static get [Symbol.species]() {
return this;
}
}
En raison de cette implémentation polymorphe, [Symbol.species] des sous-classes dérivées retourne également le constructeur lui-même par défaut.
class SubRegExp extends RegExp {}
SubRegExp[Symbol.species] === SubRegExp; // true
Certaines méthodes de RegExp créent une copie de l'instance RegExp actuelle avant d'exécuter exec(), afin que les effets secondaires tels que les modifications de lastIndex ne soient pas conservés. La propriété [Symbol.species] est utilisée pour déterminer le constructeur de la nouvelle instance. Les méthodes qui copient l'instance RegExp actuelle sont :
Exemples
>Déterminer l'espèce des objets ordinaires
La propriété [Symbol.species] retourne la fonction constructeur par défaut, qui est le constructeur RegExp pour les objets RegExp :
RegExp[Symbol.species]; // function RegExp()
Déterminer l'espèce des objets dérivés
Dans une instance d'une sous-classe personnalisée de RegExp, comme MaRegExp, l'espèce MaRegExp est le constructeur MaRegExp. Cependant, vous pouvez vouloir remplacer cela afin de retourner des objets RegExp parents dans les méthodes de votre classe dérivée :
class MaRegExp extends RegExp {
// Remplacez l'espèce MaRegExp par le constructeur RegExp de la classe parente
static get [Symbol.species]() {
return RegExp;
}
}
Ou vous pouvez utiliser ceci pour observer le processus de copie :
class MaRegExp extends RegExp {
constructor(...args) {
console.log(
"Crée une nouvelle instance de MaRegExp avec les arguments :",
args,
);
super(...args);
}
static get [Symbol.species]() {
console.log("Copie de MaRegExp");
return this;
}
exec(value) {
console.log("Exécution avec lastIndex :", this.lastIndex);
return super.exec(value);
}
}
Array.from("aabbccdd".matchAll(new MaRegExp("[ac]", "g")));
// Crée une nouvelle instance de MaRegExp avec les arguments : [ '[ac]', 'g' ]
// Copie de MaRegExp
// Crée une nouvelle instance de MaRegExp avec les arguments : [ MaRegExp /[ac]/g, 'g' ]
// Exécution avec lastIndex : 0
// Exécution avec lastIndex : 1
// Exécution avec lastIndex : 2
// Exécution avec lastIndex : 5
// Exécution avec lastIndex : 6
Spécifications
| Spécification |
|---|
| ECMAScript® 2027 Language Specification> # sec-get-regexp-%symbol.species%> |
Compatibilité des navigateurs
Voir aussi
- L'objet natif
RegExp - La propriété statique
Symbol.species