Zum Inhalt springen

JavaScript-Proxy und Reflect

JavaScript-Proxys ermöglichen es dir, Operationen an Objekten abzufangen und zu verändern. Sie bieten eine leistungsstarke Möglichkeit, dein Programmieren zu verbessern, indem sie deinen Code flexibler und wartbarer machen. Wenn du lernst, Proxys zu verwenden, kannst du robusteren und anspruchsvolleren Code erstellen und so deine allgemeinen JavaScript-Programmierpraktiken verbessern.

Einführung in JavaScript Proxy

Ein Proxy-Objekt in JavaScript ermöglicht es dir, einem Objekt eigenes Verhalten hinzuzufügen. Es erlaubt dir, Operationen wie den Zugriff auf Eigenschaften, Zuweisungen und Funktionsaufrufe abzufangen und anzupassen. Das ist nützlich für Protokollierung, Validierung oder dafür, zu verändern, wie ein Objekt in deiner Anwendung funktioniert.

Proxy-Syntax


javascript
const proxy = new Proxy(target, handler);
  • target: Das ursprüngliche Objekt, das du proxien möchtest.
  • handler: Ein Objekt mit Traps zum Abfangen von Operationen.

Den get-Trap verstehen

Der get-Trap ermöglicht es dir, Zugriffsversuche auf Eigenschaften des Zielobjekts abzufangen. Er wird oft verwendet, um Zugriffe zu protokollieren oder Eigenschaften dynamisch auf Basis der Eigenschaften des Ziels zu berechnen.

Beispiel:


Output appears here after Run.

Dieser Code richtet einen Proxy ein, um Eigenschaftszugriffe auf einem Objekt zu protokollieren.

  • Handler: Definiert einen get-Trap, um die aufgerufene Eigenschaft zu protokollieren.
  • Zielobjekt: Enthält die Eigenschaften name und age.
  • Proxy: Umhüllt das target-Objekt mit dem handler.

Wenn auf proxy.name zugegriffen wird, wird "Getting name" protokolliert und "John" zurückgegeben. Das ist nützlich, um Eigenschaftszugriffe zu überwachen oder zu debuggen.

Objektoperationen mit set- und apply-Traps manipulieren

Der set-Trap

Der set-Trap kann Regeln für Eigenschaftszuweisungen durchsetzen und sicherstellen, dass Eigenschaften bestimmte Typen haben oder bestimmte Bedingungen erfüllen.

Beispiel:


Output appears here after Run.

Dieser Code richtet einen Proxy ein, um Eigenschaftszuweisungen an einem Objekt zu validieren und zu protokollieren.

  • Handler: Definiert einen set-Trap, um die Eigenschaft age auf gültige Werte zu prüfen und Versuche, sie zu setzen, zu protokollieren.
  • Proxy: Umhüllt das target-Objekt mit dem handler.

Wenn proxy.age gesetzt wird, prüft er, ob es sich um ein gültiges Alter (0–150) handelt. Wenn nicht, protokolliert er einen Fehler und wirft eine Ausnahme.

Der apply-Trap

Die apply-Methode in einem JavaScript-Proxy fängt Funktionsaufrufe ab. Sie nimmt drei Argumente entgegen:

  1. target: Die ursprüngliche Funktion, die aufgerufen wird.
  2. thisArg: Der Wert von this innerhalb der Funktion.
  3. argumentsList: Ein Array von Argumenten, die an die Funktion übergeben werden.

Beispiel:


Output appears here after Run.

Dieser Code richtet einen Proxy ein, um Funktionsaufrufe und ihre Argumente zu protokollieren.

  • Handler: Definiert einen apply-Trap, um die Argumente zu protokollieren, wenn die Funktion aufgerufen wird.
  • Funktion: sum addiert zwei Zahlen.
  • Proxy: Umhüllt die Funktion sum mit dem handler.

Im bereitgestellten Code protokolliert der apply-Trap die Argumente und ruft dann die ursprüngliche Funktion mit target.apply(thisArg, argumentsList) auf. Das ist nützlich für Protokollierung, Debugging oder das dynamische Verändern des Funktionsverhaltens.

WARNING

JavaScript-Proxys sind mächtig, aber setze sie mit Bedacht ein. Ein übermäßiger Einsatz von Proxys kann deinen Code schwerer verständlich und wartbar machen. Beachte, dass Proxys im Vergleich zu nativen Objekten einen leichten Performance-Overhead verursachen.

Reflect-API

Die JavaScript-Reflect-API ist ein eingebautes Objekt, das Methoden für abfangbare JavaScript-Operationen bereitstellt. Diese Methoden ähneln denen von Objekten wie Object, Function und Array. Der Hauptzweck von Reflect besteht darin, Operationen vorhersehbarer zu machen und Entwicklern zu helfen, saubereren Code zu schreiben.

Hier ist eine einfache Erklärung einiger wichtiger Reflect-Methoden mit Beispielen:

1. Reflect.get()

Diese Methode wird verwendet, um den Wert einer Eigenschaft aus einem Objekt zu holen.

Beispiel:


Output appears here after Run.

2. Reflect.set()

Diese Methode wird verwendet, um den Wert einer Eigenschaft auf einem Objekt zu setzen.

Beispiel:


Output appears here after Run.

3. Reflect.has()

Diese Methode prüft, ob eine Eigenschaft in einem Objekt existiert.

Beispiel:


Output appears here after Run.

4. Reflect.deleteProperty()

Diese Methode löscht eine Eigenschaft aus einem Objekt.

Beispiel:


Output appears here after Run.

5. Reflect.ownKeys()

Diese Methode gibt alle eigenen Eigenschaftsschlüssel eines Objekts zurück.

Beispiel:


Output appears here after Run.

6. Reflect.apply()

Diese Methode ruft eine Ziel-Funktion mit gegebenen Argumenten auf.

Beispiel:


Output appears here after Run.

7. Reflect.construct()

Diese Methode wird verwendet, um eine neue Instanz eines Objekts zu erstellen.

Beispiel:


Output appears here after Run.

Diese Beispiele zeigen, wie du Reflect-Methoden verwenden kannst, um häufige Operationen an Objekten sauberer und konsistenter auszuführen.

Praktische Anwendungsfälle von JavaScript-Proxys

Beispiel 1: Automatische Eigenschaftsinitialisierung

Beschreibung: Verwende JavaScript-Proxys, um undefinierte Eigenschaften in einem Objekt automatisch zu initialisieren. Das kann in Situationen nützlich sein, in denen Objekte im Laufe der Zeit dynamisch mit Daten gefüllt werden, etwa bei Benutzereinstellungen oder Konfigurationen, die anfangs möglicherweise noch nicht gesetzt sind.


Output appears here after Run.

Dieser Code erstellt einen Proxy, der prüft, ob eine Eigenschaft auf einem Objekt existiert. Wenn nicht, setzt der Proxy automatisch einen Standardwert dafür. Das ist hilfreich, um Fehler durch fehlende Eigenschaften zu vermeiden.

Beispiel 2: Zugriffskontrolle

Beschreibung: Proxys können Lese- oder Schreibberechtigungen für Objekteigenschaften durchsetzen. Dieses Beispiel zeigt einen Proxy, der das Lesen oder Schreiben bestimmter Eigenschaften anhand vordefinierter Regeln verhindert, was besonders nützlich für die Verwaltung des Zugriffs auf sensible Daten ist.


Output appears here after Run.

Dieser Code sichert ein Objekt, indem der Zugriff auf seine Eigenschaften kontrolliert wird. Er blockiert das Lesen von 'sensitiveData' und verhindert das Ändern von 'readOnly'-Eigenschaften, wodurch Daten geschützt bleiben.

Beispiel 3: Protokollierung und Debugging

Beschreibung: Proxys können verwendet werden, um Interaktionen mit einem Objekt zu protokollieren, was beim Debugging und bei der Überwachung von Operationen hilft. Dieses Beispiel erstellt einen Proxy, der alle Gets, Sets und Methodenaufrufe protokolliert, die an einem Objekt ausgeführt werden.


Output appears here after Run.

Dieser Code verfolgt jedes Mal, wenn jemand auf eine Eigenschaft des Objekts zugreift oder sie ändert, was großartig ist, um zu verstehen, was dein Code tut und wann.

Beispiel 4: Datenvalidierung

Beschreibung: Verwende Proxys für die Validierung von Objekteigenschaften in Echtzeit. Das ist besonders nützlich, um die Datenintegrität sicherzustellen, wenn Objekte in einer Anwendung dynamisch aktualisiert werden.


Output appears here after Run.

Dieses Beispiel zeigt, wie du JavaScripts Proxy verwenden kannst, um Eigenschaftsänderungen zu validieren und zu protokollieren. Das validator-Objekt prüft, ob die Eigenschaft age eine gültige Zahl zwischen 0 und 150 ist. Wenn nicht, protokolliert es einen Fehler und wirft eine Ausnahme. Andernfalls protokolliert es den neuen Wert und aktualisiert die Eigenschaft. Das person-Objekt verwendet diesen Validator, um seine age-Eigenschaft zu verwalten und sicherzustellen, dass ungültige Altersangaben erkannt und protokolliert werden.

Fazit

Die Beherrschung von JavaScript-Proxys ermöglicht es dir, das Verhalten deines Codes zu steuern und zu verbessern. Proxys können die Sicherheit erhöhen, Klassen um eigenes Verhalten erweitern und Debugging-Tools verbessern. Sie helfen dabei, dynamischere und sicherere Anwendungen zu erstellen, was zu saubererem, effizienterem und wartbareren Code führt. Dieses Wissen wird deine JavaScript-Entwicklungsfähigkeiten verbessern und dich darauf vorbereiten, moderne Web-Herausforderungen zu meistern.

Practice

What is the main functionality of JavaScript's Proxy and Reflect objects?

Finden Sie das nützlich?

Dual-run-Vorschau — vergleichen Sie mit den Symfony-Routen live.