diff --git a/src/components/slides/javascript/09-web-api/index.astro b/src/components/slides/javascript/09-web-api/index.astro index 2826b85..605f476 100644 --- a/src/components/slides/javascript/09-web-api/index.astro +++ b/src/components/slides/javascript/09-web-api/index.astro @@ -4,10 +4,6 @@ import HistoryApi from "./history.astro"; import FilesApi from './files.astro'; import IntersectionApi from './intersection.astro'; import ProxyApi from './proxy.astro'; -// import SelectionApi from './selection.astro'; -// import ServiceWorker from './service-worker.astro'; -// import SpeechApi from './speech.astro'; -// import AnimationApi from './animations.astro'; import StorageApi from "./storage.astro"; --- diff --git a/src/components/slides/javascript/09-web-api/proxy.astro b/src/components/slides/javascript/09-web-api/proxy.astro index 2e278b5..a36c76d 100644 --- a/src/components/slides/javascript/09-web-api/proxy.astro +++ b/src/components/slides/javascript/09-web-api/proxy.astro @@ -2,4 +2,82 @@

Proxy API

+ +
+

Die Proxy-API ist ein Interface mit dem man JavaScript-Variablen "beobachten" kann.

+

Wir können eine Proxy als Man-In-The-Middle Wrapper um eine Variable ansehen. Die Proxy kann auf Lese-Zugriffe als auch auf Schreib-Zugriffe reagieren und das normale Verhalten beeinflußen.

+

Die Proxy-API ist eine sehr mächtige API und wird von vielen großen Frameworks (unter anderem VueJS) verwendet um z.B. Reactivität zu erreichen.

+
+ +
+

Grundlegendes Beispiel

+

+			const myObject = {
+				value: "Hallo",
+			};
+
+			// Mittels dem handler können wir Operationen beeinflußen
+			const handler = {};
+			
+			// Wir erstellen ein neues Objekt mithilfe der Proxy-Klasse
+			// und dessen Handler
+			const proxied = new Proxy(myObject, handler);
+		
+
+ +
+

Erweitern wir nun das handler Objekt

+

+			const handler = {
+				get(target, prop, receiver) {
+					if (prop === 'value') {
+						return `${target[prop]} Welt!`;	
+					}
+				}
+			};
+			// ...
+
+			console.log(proxied.value);
+		
+
+ +
+

Wir können nun also beim Abfragen von Werten in den Zugriff auf die Variable zugreifen und den return-Wert modifizieren.

+

Dass, was wir gerade eben Entwickelt haben, nennt sich eine Trap. Wir haben verschiedene Traps für die verschiedensten Arten von Variablen.

+
+ +
+ +
+ +
+

Betrachten wir nochmals das Beispiel mit der get() trap.

+

Wenn wir versuchen einen anderen Wert also value abzufragen, erhalten wir ein undefined, auch wenn der Wert im Objekt gesetzt ist.

+

Wir müssen also noch eine Art Fallback implementieren, falls es zu einem "Case" kommt, in dem der default ausgeführt werden soll (in unserem Falle, den gespeicherten Wert zurück geben)

+
+ +
+

Machen wir das nun mal. Hierfür verwenden wir eine spezialisierte konstante Reflect

+

+			const handler = {
+				get(target, prop, receiver) {
+					if (prop === 'value') {
+						return `${target[prop]} Welt!`;
+						}
+					return Reflect.get(...arguments);
+				}
+			};
+		
+
+ +
+

Das Reflect Objekt enthält Funktionen die den gleichen Namen besitzen wie die, die man in den Traps definieren kann.

+

Wenn diese Aufgerufen und zurück gegeben werden, so wird die originale Aktion am Objekt ausgeführt. Wir können dies also als "Default" Aktion definieren wenn nur auf bestimmte Werte innerhalb einer Trap reagieren wollen.

+