このページはコミュニティーの尽力で英語から翻訳されました。MDN Web Docsコミュニティーについてもっと知り、仲間になるにはこちらから。
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 2016年9月.
RegExp[Symbol.species] は静的なアクセサープロパティで、特定のRegExp メソッドのコピーされた正規表現を構築するのに使用されたコンストラクターを返します。
警告:[Symbol.species] が存在すると、任意のコードの実行が可能になり、セキュリティ上の脆弱性が生じる可能性があります。また、ある種の最適化も非常に難しくなります。エンジンの実装者たちは、この機能を削除するかどうか調査しています。可能であれば、この機能に頼ることは避けてください。
In this article
構文
RegExp[Symbol.species]返値
get [Symbol.species] が呼び出されたコンストラクター (this) の値。この返値は、コピーしたRegExp インスタンスを作成するために使用されます。
解説
[Symbol.species] アクセサープロパティは、RegExp の既定のコンストラクターを返します。サブクラスのコンストラクターは、オーバーライドすることでコンストラクターの割り当てを変更することができます。既定の実装は基本的に次の通りです。
// 説明のための架空の基礎実装class RegExp { static get [Symbol.species]() { return this; }}この多相的な実装により、派生したサブクラスのSymbol.species も既定でコンストラクター自身を返すようになります。
class SubRegExp extends RegExp {}SubRegExp[Symbol.species] === SubRegExp; // true一部のRegExp メソッドは、exec() を実行する前に現在の正規表現インスタンスのコピーを作成します。そのため、lastIndex への変更が保持されないような副作用があります。Symbol.species プロパティは、新しいインスタンスのコンストラクターを決定するために使用されます。正規表現インスタンスをコピーするメソッドは以下の通りです。
例
>通常オブジェクトの species
Symbol.species プロパティは、既定のコンストラクターを返します。RegExp オブジェクトであれば、RegExp コンストラクターを返します。
RegExp[Symbol.species]; // function RegExp()派生オブジェクトの species
派生クラスのコレクションオブジェクト(たとえば、独自の正規表現を表すMyRegExp)では、MyRegExp の species はMyRegExp コンストラクターです。しかし、派生クラスのメソッドで親であるRegExp オブジェクトを返すようにこれをオーバーライドしたくなるかもしれません。
class MyRegExp extends RegExp { // MyRegExp の species を親である RegExp コンストラクターにオーバーライドします。 static get [Symbol.species]() { return RegExp; }}または、これを使用してコピープロセスを監視することができます。
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仕様書
| Specification |
|---|
| ECMAScript® 2026 Language Specification> # sec-get-regexp-%symbol.species%> |