Heim >Web-Frontend >js-Tutorial >Wie erweitere ich Funktionen mit ES6-Klassen und greife auf Instanzvariablen zu?
Funktionen mit ES6-Klassen erweitern
ES6 führt die Möglichkeit ein, spezielle Objekte wie das Funktionsobjekt zu erweitern. Dadurch können wir Klassen erstellen, die von Funktionen erben und sich beim Aufruf wie Funktionen verhalten. Die Implementierung der Logik für solche Aufrufe erfordert jedoch sorgfältige Überlegungen.
Den Funktionsprototyp verstehen
Beim Aufrufen einer Klasse als Funktion bezieht sich das Schlüsselwort this auf das globale Objekt (Fenster in einer Browserumgebung) und nicht die Klasseninstanz. Um auf die Klasseninstanz zuzugreifen, können wir den herkömmlichen super()-Aufruf nicht verwenden, da er eine Codezeichenfolge für den Funktionskonstruktor erwartet.
Hardcodierung des Werts
Ein Ansatz besteht darin, den Wert fest im Konstruktor zu kodieren:
class Smth extends Function { constructor(x) { super("return " + JSON.stringify(x) + ";"); } } (new Smth(256))() // Returns 256
Dies ist jedoch nicht ideal, da es auf fest kodierten Werten basiert.
Verschlüsse nutzen
Um einen Abschluss zu ermöglichen, der auf Instanzvariablen zugreifen kann, können wir eine verschachtelte Funktion innerhalb des Konstruktors erstellen:
class Smth extends Function { constructor(x) { // Refer to `smth` instead of `this` function smth() { return x; } Object.setPrototypeOf(smth, Smth.prototype); return smth; } } (new Smth(256))() // Returns 256
Abstraktion mit ExtensibleFunction
Um dieses Muster zu abstrahieren, Wir können eine ExtensibleFunction-Klasse erstellen:
class ExtensibleFunction extends Function { constructor(f) { return Object.setPrototypeOf(f, new.target.prototype); } } class Smth extends ExtensibleFunction { constructor(x) { super(function() { return x; }); } } (new Smth(256))() // Returns 256
Dieser Ansatz bietet eine wiederverwendbare Möglichkeit, erweiterbare Funktionen mit Zugriff auf Instanzvariablen zu erstellen.
Das obige ist der detaillierte Inhalt vonWie erweitere ich Funktionen mit ES6-Klassen und greife auf Instanzvariablen zu?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!