javascript / expert
Snippet
Subclassing Array with Custom Symbol.species Transformation Pipelines
Overriding Symbol.species in Array subclasses dictates whether standard array derivation methods like slice or map construct instances of the subclass or standard Array.
snippet.js
javascript
1
2
3
4
5
6
7
8
9
10
11
12
13
class MatrixArray extends Array {static get [Symbol.species]() {return Array;}sum() {return this.reduce((acc, val) => acc + val, 0);}}const matrix = new MatrixArray(10, 20, 30);const sliced = matrix.slice(1);console.log(matrix.sum(), sliced instanceof MatrixArray);
nodejs
Breakdown
1
class MatrixArray extends Array {
Extends built-in Array constructor with custom array methods.
2
static get [Symbol.species]() {
Defines static getter for species constructor delegation.
3
return Array;
Forces Array methods to instantiate native Array objects for derived results.
4
}
Closes Symbol.species getter definition.
5
sum() {
Defines custom instance method on MatrixArray prototype.
6
return this.reduce((acc, val) => acc + val, 0);
Calculates numeric sum using Array prototype reduce.
7
}
Closes sum method block.
8
}
Closes MatrixArray class declaration.
9
const matrix = new MatrixArray(10, 20, 30);
Creates custom MatrixArray instance populated with numbers.
10
const sliced = matrix.slice(1);
Slices elements using species override constructor.
11
console.log(matrix.sum(), sliced instanceof MatrixArray);
Logs computed sum and verifies sliced is standard Array instance (false).