【JSリファレンス】Symbol.species

更新日:2024/06/14

Symbol.speciesは、Symbolコンストラクターのプロパティです。

既知シンボル(well-known symbol) @@species の実体を返します。
オブジェクトのプロパティ名として既知シンボルを使用すると、そのプロパティが一部の組み込みメソッドまたは演算子から参照されます。

[Symbol.species]プロパティは、Array.prototype.map()等のメソッドで結果を格納するオブジェクトを生成するコンストラクター関数を指定します。

Class構文の extends にArrayコンストラクターを指定した際に、map()等のメソッドは、Classのインスタンスを返します。

const MyArray = class extends Array{
    constructor(){
        super();
        this.description = "MyArray";
    }
}

const myArray = new MyArray();
myArray[0]=100;myArray[1]=200;

const mapArray = myArray.map( e=>e*2 );

  // myArray.map()の戻り値は MyArray
console.log(  mapArray instanceof MyArray ); // true
console.log(  mapArray.description ); // MyArray

静的プロパティとして[Symbol.species]を定義すると、map()等のメソッドで生成するインスタンスを変更できます。

const MyArray = class extends Array{
    constructor(){
        super();
        this.description = "MyArray";
    }
    static get [Symbol.species](){
        return Array; // Arrayに変更
    }
}

const myArray = new MyArray();
myArray[0]=100;myArray[1]=200;

const mapArray = myArray.map( e=>e*2 );

  // myArray.map()の戻り値は?
console.log(  mapArray instanceof MyArray ); // false ← MyArray ではない
console.log(  mapArray instanceof Array ); // true ← Array である

 // descriptionプロパティは所持していない
console.log(  mapArray.description ); // undefined

[Symbol.species]を静的ゲッターで定義していますが、上書きを考慮しないなら静的プロパティでも問題ありません。

 

関連ページ

更新日:2024/06/14

書いた人(管理人):けーちゃん

スポンサーリンク

記事の内容について

null

こんにちはけーちゃんです。
説明するのって難しいですね。

「なんか言ってることおかしくない?」
たぶん、こんなご意見あると思います。

裏付けを取りながら記事を作成していますが、僕の勘違いだったり、そもそも情報源の内容が間違えていたりで、正確でないことが多いと思います。
そんなときは、ご意見もらえたら嬉しいです。

掲載コードについては事前に動作確認をしていますが、貼り付け後に体裁を整えるなどをした結果動作しないものになっていることがあります。
生暖かい視線でスルーするか、ご指摘ください。

ご意見、ご指摘はこちら。
https://jsref.affi-sapo-sv.com/info.php

 

このサイトは、リンクフリーです。大歓迎です。