Webエンジニア向けプログラミング解説動画をYouTubeで配信中!
▶ チャンネル登録はこちら

【JavaScript ECMAScript】Array::Array[Symbol.species]静的アクセサプロパティの使い方

Array[Symbol.species]静的アクセサプロパティの使い方について、初心者にもわかりやすく解説します。

作成日: 更新日:

基本的な使い方

Array[Symbol.species]プロパティは、Arrayクラスを継承した派生クラスが、親クラスのメソッドによって新しい配列インスタンスが作成される際に、どのコンストラクタ(設計図)を使用するかを定義するための特別なプロパティです。このプロパティは、Symbol.speciesというWell-known Symbolを使ってアクセスされます。

具体的には、Arrayのサブクラスがmap()filter()slice()といったメソッドを呼び出して新しい配列を生成する際、通常は基底クラスであるArrayのインスタンスが返されます。しかし、この[Symbol.species]プロパティをサブクラス内で設定することで、その振る舞いを変更し、サブクラス自身のインスタンスを返すようにカスタマイズできます。

例えば、class MyArray extends Array {}というArrayを継承したクラスを作成し、const myArr = new MyArray(1, 2, 3);とインスタンスを生成します。このmyArrに対してmyArr.map(x => x * 2)を実行すると、デフォルトでは結果として新しいArrayのインスタンスが返されます。しかし、MyArrayクラス内にstatic get [Symbol.species]() { return MyArray; }と定義すると、mapメソッドはMyArrayのインスタンスを返すようになります。

このプロパティのデフォルト値はArrayコンストラクタ自体であるため、[Symbol.species]を明示的にオーバーライドしない限り、Arrayクラスやそれを継承していないクラスの操作メソッドは常に新しいArrayインスタンスを生成します。この機能は、特定の振る舞いを持つカスタム配列クラスを設計する際に、クラスの継承関係とメソッドの戻り値の一貫性を保つ上で非常に有用です。これにより、サブクラスのインスタンスが親クラスのメソッドを介してもサブクラスの型を維持できるため、型の一貫性を確保し、より堅牢なコードを記述することに役立ちます。

公式リファレンス: Array[Symbol.species]

構文(syntax)

1Array[Symbol.species];

引数(parameters)

引数なし

引数はありません

戻り値(return)

Function

Array[Symbol.species] は、Array.prototype.map() や Array.prototype.filter() などのメソッドによって生成される新しい配列のコンストラクタを返します。これにより、派生クラスで Array の挙動をカスタマイズできます。

関連コンテンツ

関連プログラミング言語