javascript / expert
Snippet
Erzwingung abstrakter Klassenverträge mittels new.target-Metaprogrammierung
JavaScript besitzt von Haus aus kein explizites abstract-Schlüsselwort. Abstrakte Klassen und Schnittstellenanforderungen können jedoch mithilfe von new.target im Basiskonstruktor erzwungen werden. new.target verweist auf den Konstruktor, der direkt durch new aufgerufen wurde, was direkte Instanziierungen verhindert und Methodenimplementierungen in Unterklassen erzwingt.
snippet.js
javascript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class AbstractRepository {constructor() {if (new.target === AbstractRepository) {throw new TypeError('Cannot instantiate abstract class directly.');}if (typeof this.find !== 'function') {throw new TypeError(`${new.target.name} must implement method 'find()'.`);}}}class UserRepository extends AbstractRepository {find(id) {return { id, name: 'Alex' };}}const repo = new UserRepository();console.log(repo.find(42));
nodejs
Erklärung
1
if (new.target === AbstractRepository)
Erkennt, ob der abstrakte Basisklassen-Konstruktor direkt über new instanziiert wurde.
2
throw new TypeError(...)
Wirft einen Typfehler, um direkte Instanziierungen von Basisklassen ohne Vererbung zu verhindern.
3
typeof this.find !== 'function'
Überprüft das instanziierte Objekt, ob die konkrete Unterklasse den verlangten Vertrag erfüllt.
4
${new.target.name}
Greift auf den Namen des abgeleiteten Konstruktors zu, der die Instanziierung ausgelöst hat.