ArrayBuffer[Symbol.species]

ArrayBuffer[Symbol.species] は静的アクセサープロパティで、配列バッファーメソッドから返値を作成するために使用されるコンストラクターを返します。

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

構文

js
ArrayBuffer[Symbol.species]

返値

get [Symbol.species] が呼び出されたコンストラクター (this) の値です。この返値は、新しい配列バッファーを作成する配列バッファーのメソッドから返値を作成するために使用されます。

解説

[Symbol.species] アクセサープロパティは、既定のコンストラクターである ArrayBuffer オブジェクトを返します。サブクラスのコンストラクターはコンストラクターに代入することで、これをオーバーライドできます。

js
// 説明のための仮想の基盤実装
class ArrayBuffer {
  static get [Symbol.species]() {
    return this;
  }
}

この 多態的な実装のために、派生したサブクラスの [Symbol.species] も既定値ではコンストラクター自身を返すことになります。

js
class SubArrayBuffer extends ArrayBuffer {}
SubArrayBuffer[Symbol.species] === SubArrayBuffer; // true

既存のオブジェクトを変異させず、新しい配列バッファーのインスタンスを返す配列バッファーのメソッド(例: slice())を呼び出す場合、オブジェクトの constructor[Symbol.species] にアクセスすることになります。返されたコンストラクターは、配列バッファーメソッドの返値を構成するために使用されます。

通常のオブジェクトの spicies

species プロパティは、ArrayBuffer オブジェクトの既定のコンストラクター関数である ArrayBuffer コンストラクターを返します。

js
ArrayBuffer[Symbol.species]; // ArrayBuffer() 関数

派生オブジェクトの spicies

派生コレクションオブジェクト(たとえば、独自の配列バッファーである MyArrayBuffer)では、MyArrayBuffer の species は MyArrayBuffer コンストラクターです。しかし、派生クラスのメソッドで、親である ArrayBuffer オブジェクトを返すためにこれをオーバーライドしたいかもしれません。

js
class MyArrayBuffer extends ArrayBuffer {
  // MyArrayBuffer species を親である ArrayBuffer コンストラクターにオーバーライド。
  static get [Symbol.species]() {
    return ArrayBuffer;
  }
}

仕様書

Specification
ECMAScript Language Specification
# sec-get-arraybuffer-%symbol.species%

ブラウザーの互換性

BCD tables only load in the browser

関連情報