ES6からArrayのような組み込みクラスに足して堅牢なサブクラスを作成でき、classとextendsを使用します。
class EZArray extends Array {
get first() { return this[0] }
get last() { return this[this.length - 1] }
}
let e = new EZArray(1, 2, 3)
let f = e.map(x => x * x)
e.last // => 3
f.last // => 9
Arrayにはcontact()、filter()、map()、slice()、splice()というメソッドが定義されています。ES6の仕様では、この5つの配列を返すメソッドはサブクラスのインスタンスを返すとされています。仕組みは以下の通りです。
- ES6以降では、Array()コンスラクタはSynbol.spaciesというSymbol名のプロパティを持つ
- extendsを使ってサブラクスを作るときに、結果として得られるサブクラスのコンストラクタは、スーパークラスのコンストラクタからプロパティを継承する
- map()やslice()のように、新しい配列を作成して、この配列を返すメソッドは、ES6以降では通常のArrayを作成するのではなく、新しい配列を作成するためにnew this.constructor[Symbol.species] ()を呼び出す
参考