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
シンボルでこれを実現することができます。
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