javascript / expert
Snippet
Steuerung von Subclass-Array-Transformationen über Symbol.species
Beim Erstellen von Unterklassen integrierter Datenstrukturen wie Array geben abgeleitete Methoden wie .map(), .filter() oder .slice() standardmäßig neue Instanzen der Unterklasse zurück. Die Definition eines statischen Getters für Symbol.species ermöglicht es abgeleiteten Klassen, dieses Verhalten zu überschreiben, sodass Transformationen gewöhnliche Array-Instanzen zurückgeben.
snippet.js
javascript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class AuditList extends Array {static get [Symbol.species]() {return Array;}logAudit(action) {this.push(`[${new Date().toISOString()}] ${action}`);}}const audit = new AuditList();audit.logAudit('USER_LOGIN');const filtered = audit.map(entry => entry.toUpperCase());console.log(audit instanceof AuditList);console.log(filtered instanceof AuditList);console.log(filtered instanceof Array);
nodejs
Erklärung
1
class AuditList extends Array
Erweitert den nativen JavaScript-Prototyp Array um spezielle Protokollierungsmethoden.
2
static get [Symbol.species]()
Statischer Getter für das bekannte Symbol, das festlegt, welcher Konstruktor für abgeleitete Objekte genutzt wird.
3
return Array;
Zwingt Methoden wie .map(), Standard-Array-Objekte anstelle von neuen AuditList-Instanzen zu erzeugen.
4
audit.map(...)
Führt die Array-Transformation aus und liefert ein Basis-Array-Ergebnis zurück, was unerwünschten Subclass-Overhead vermeidet.