javascript / expert
Snippet
Reaktive Array-Unterklassen mittels Proxy-Traps und Symbol.species
Das Erstellen von Unterklassen von Array in JavaScript erfordert eine präzise Steuerung von Methodenspezies und Proxy-Traps. Symbol.species stellt sicher, dass eingebaute Array-Methoden wie slice oder map standardmäßige Array-Instanzen anstelle von Unterklassen-Instanzen zurückgeben, was ungewollte Handler-Leaks verhindert. Die Kapselung der Unterklasse in einem Proxy fängt Elementzugriffe und Mutation transparent ab.
snippet.js
javascript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
class ObservableArray extends Array {static get [Symbol.species]() {return Array;}static create(onMutation, ...items) {const instance = new ObservableArray(...items);return new Proxy(instance, {set(target, prop, value, receiver) {const res = Reflect.set(target, prop, value, receiver);if (typeof prop !== 'symbol' && !isNaN(Number(prop))) {onMutation({ type: 'set', index: Number(prop), value });}return res;}});}}const list = ObservableArray.create(m => console.log('Mutated:', m), 'a', 'b');const sub = list.slice(0, 1);list[2] = 'c';
nodejs
Erklärung
1
static get [Symbol.species]() { return Array; }
Überschreibt den Species-Accessor, sodass abgeleitete Array-Operationen Basis-Array-Instanzen zurückgeben.
2
return new Proxy(instance, {
Hüllt die angepasste Array-Instanz in einen Proxy-Handler ein, um interne Traps abzufangen.
3
set(target, prop, value, receiver) {
Fängt Eigenschaftszuweisungen ab, um numerische Indexänderungen zu verfolgen und Mutations-Hooks auszulösen.