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.

Symbol.species は静的データプロパティで、ウェルノウンシンボルである Symbol.species を表します。オブジェクトのコピーを作成するメソッドは、このシンボルで、コピーを作成するときに使用するコンストラクター関数を探すことがあります。

警告: [Symbol.species] が存在することで、任意のコードの実行を可能にし、セキュリティの脆弱性を生み出す可能性があります。また、一部の最適化がとても難しくなります。エンジンの実装者はこの機能を削除するかどうかを調査しています。可能であれば、この機能への依存は避けてください。

試してみましょう

ウェルノウンシンボル Symbol.species です。

Symbol.species のプロパティ属性
書込可能 不可
列挙可能 不可
設定可能 不可

解説

[Symbol.species] アクセサープロパティを使用すると、サブクラスがオブジェクトの既定のコンストラクターをオーバーライドできるようになります。これは、インスタンスをコピーするときの手順を指定します。例えば、map() のような配列のコピーメソッドを使用する場合、map() メソッドは instance.constructor[Symbol.species] を使用して新しい配列を構築するコンストラクターを取得します。詳細については、組み込みオブジェクトのサブクラス化を参照してください。

すべての組み込みオブジェクトにおいて、[Symbol.species] は現在のインスタンスのコンストラクターである this の値を返すよう実装されています。これにより、メソッドをコピーして基底クラスではなく派生クラスのインスタンスを作成することができます。例えば、map() は元の配列と同じ型の配列を返します。

species の使用

Array オブジェクトを派生した配列クラス MyArray で返したいことがあるでしょう。例えば、既定のコンストラクターを返す map() のようなメソッドを使用している場合、これらのメソッドは親の Array オブジェクトを、MyArray オブジェクトの代わりに返したいとします。species シンボルでこれを実現することができます。

js
class MyArray extends Array {
  // species を親である Array コンストラクターで上書き
  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

仕様書

Specification
ECMAScript Language Specification
# sec-symbol.species

ブラウザーの互換性

BCD tables only load in the browser

関連情報