javascript / expert
Snippet
Polymorphe Ereignis-Emitter-Hierarchie für abstrakte React-Zustands-Controller
Demonstriert objektorientierte Entwurfsprinzipien mit privaten Klassenfeldern, new.target-Prüfungen für abstrakten Instanziierungsschutz und unveränderlichem State-Freezing zur Erstellung einer erweiterbaren Basisklasse für externe React-Store-Subscriptions.
snippet.js
javascript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class AbstractStateController {#listeners = new Map();constructor(initialState) {if (new.target === AbstractStateController) {throw new TypeError("Cannot instantiate abstract class directly.");}this.state = Object.freeze({ ...initialState });}subscribe(event, handler) {if (!this.#listeners.has(event)) this.#listeners.set(event, new Set());this.#listeners.get(event).add(handler);return () => this.#listeners.get(event).delete(handler);}emit(event, payload) {this.#listeners.get(event)?.forEach((fn) => fn(payload, this.state));}}
react
Erklärung
1
#listeners = new Map();
Nutzt die Syntax privater Klassenfelder, um Event-Listener-Zuordnungen vollständig vor externem Zugriff zu kapseln.
2
if (new.target === AbstractStateController) {
Erzwingt abstrakte Klassensemantik in JavaScript durch Überprüfung, ob der Konstruktor direkt aufgerufen wurde.
3
this.state = Object.freeze({ ...initialState });
Garantiert Unveränderlichkeit des Zustands durch ein flaches Einfrieren des initialen Zustandsobjekts.
4
return () => this.#listeners.get(event).delete(handler);
Gibt eine Bereinigungs-Closure-Funktion zurück, die den Anforderungen von React-useEffect-Subscriptions entspricht.