Movatterモバイル変換


[0]ホーム

URL:


  1. Web
  2. JavaScript
  3. JavaScript-Leitfaden
  4. Metaprogrammierung

Dieser Inhalt wurde automatisch aus dem Englischen übersetzt, und kann Fehler enthalten.Erfahre mehr über dieses Experiment.

View in EnglishAlways switch to English

Metaprogrammierung

Die ObjekteProxy undReflect ermöglichen es Ihnen, grundlegende Sprachoperationen (z.B. Eigenschaftsabruf, Zuweisung, Enumeration, Funktionsaufruf, etc.) abzufangen und benutzerdefiniertes Verhalten dafür zu definieren. Mit Hilfe dieser beiden Objekte können Sie auf der Metaebene von JavaScript programmieren.

Proxies

Proxy-Objekte ermöglichen es Ihnen, bestimmte Operationen abzufangen und benutzerdefinierte Verhaltensweisen zu implementieren.

Beispielsweise beim Abrufen einer Eigenschaft eines Objekts:

js
const handler = {  get(target, name) {    return name in target ? target[name] : 42;  },};const p = new Proxy({}, handler);p.a = 1;console.log(p.a, p.b); // 1, 42

DasProxy-Objekt definiert eintarget (hier ein leeres Objekt) und einhandler-Objekt, in dem eineget-Falle (trap) implementiert ist. Hierdurch wird ein Objekt, das durch einen Proxy gekapselt ist, nichtundefined zurückgeben, wenn undefinierte Eigenschaften abgerufen werden, sondern stattdessen die Zahl42.

Zusätzliche Beispiele sind auf derProxy Referenzseite verfügbar.

Terminologie

Die folgenden Begriffe werden verwendet, wenn über die Funktionalität von Proxies gesprochen wird.

handler

Platzhalterobjekt, das Fallen enthält.

Fallen

Die Methoden, die den Zugriff auf Eigenschaften bereitstellen. (Dies ist analog zum Konzept derFallen in Betriebssystemen.)

Zielobjekt

Objekt, das der Proxy virtualisiert. Es wird häufig als Speicherrückendeckung für den Proxy eingesetzt. Invarianten (nicht veränderbare Semantiken) bezüglich der Nicht-Erweiterbarkeit oder nicht-konfigurierbarer Eigenschaften werden gegen das Zielobjekt überprüft.

Invarianten

Semantiken, die unverändert bleiben, wenn benutzerdefinierte Operationen implementiert werden, werdenInvarianten genannt. Wenn Sie die Invarianten eines Handlers verletzen, wird einTypeError ausgelöst.

Handler und Fallen

Die folgende Tabelle fasst die verfügbaren Fallen zusammen, die fürProxy-Objekte verfügbar sind. Siehe dieReferenzseiten für detaillierte Erklärungen und Beispiele.

Handler / FalleAbfangaktionen
handler.getPrototypeOf()Object.getPrototypeOf()
Reflect.getPrototypeOf()
__proto__
Object.prototype.isPrototypeOf()
instanceof
handler.setPrototypeOf()Object.setPrototypeOf()
Reflect.setPrototypeOf()
handler.isExtensible()Object.isExtensible()
Reflect.isExtensible()
handler.preventExtensions()Object.preventExtensions()
Reflect.preventExtensions()
handler.getOwnPropertyDescriptor()Object.getOwnPropertyDescriptor()
Reflect.getOwnPropertyDescriptor()
handler.defineProperty()Object.defineProperty()
Reflect.defineProperty()
handler.has()
Eigenschaftsanfrage
foo in proxy
Vererbte Eigenschaftsanfrage
foo in Object.create(proxy)
Reflect.has()
handler.get()
Eigenschaftszugriff
proxy[foo]
proxy.bar
Vererbter Eigenschaftszugriff
Object.create(proxy)[foo]
Reflect.get()
handler.set()
Eigenschaftszuweisung
proxy[foo] = bar
proxy.foo = bar
Vererbte Eigenschaftszuweisung
Object.create(proxy)[foo] = bar
Reflect.set()
handler.deleteProperty()
Eigenschaftslöschung
deleteproxy[foo]
deleteproxy.foo
Reflect.deleteProperty()
handler.ownKeys()Object.getOwnPropertyNames()
Object.getOwnPropertySymbols()
Object.keys()
Reflect.ownKeys()
handler.apply()proxy(..args)
Function.prototype.apply() andFunction.prototype.call()
Reflect.apply()
handler.construct()new proxy(...args)
Reflect.construct()

WiderrufbarerProxy

Die MethodeProxy.revocable() wird verwendet, um ein widerrufbaresProxy-Objekt zu erstellen. Dies bedeutet, dass der Proxy über die Funktionrevoke widerrufen und ausgeschaltet werden kann.

Danach führt jede Operation auf dem Proxy zu einemTypeError.

js
const revocable = Proxy.revocable(  {},  {    get(target, name) {      return `[[${name}]]`;    },  },);const proxy = revocable.proxy;console.log(proxy.foo); // "[[foo]]"revocable.revoke();console.log(proxy.foo); // TypeError: Cannot perform 'get' on a proxy that has been revokedproxy.foo = 1; // TypeError: Cannot perform 'set' on a proxy that has been revokeddelete proxy.foo; // TypeError: Cannot perform 'deleteProperty' on a proxy that has been revokedconsole.log(typeof proxy); // "object", typeof doesn't trigger any trap

Reflexion

Reflect ist ein eingebautes Objekt, das Methoden für abfangbare JavaScript-Operationen bereitstellt. Die Methoden sind die gleichen wie die derProxy-Handler.

Reflect ist kein Funktionsobjekt.

Reflect hilft, Standardoperationen vom Handler an dastarget weiterzuleiten.

MitReflect.has() erhalten Sie beispielsweise denin Operator als Funktion:

js
Reflect.has(Object, "assign"); // true

Eine bessere apply() Funktion

VorReflect verwenden Sie in der Regel die MethodeFunction.prototype.apply(), um eine Funktion mit einem gegebenenthis-Wert undarguments, bereitgestellt als Array (oder einarray-ähnliches Objekt), aufzurufen.

js
Function.prototype.apply.call(Math.floor, undefined, [1.75]);

MitReflect.apply wird dies weniger umständlich und leichter verständlich:

js
Reflect.apply(Math.floor, undefined, [1.75]);// 1Reflect.apply(String.fromCharCode, undefined, [104, 101, 108, 108, 111]);// "hello"Reflect.apply(RegExp.prototype.exec, /ab/, ["confabulation"]).index;// 4Reflect.apply("".charAt, "ponies", [3]);// "i"

Überprüfen, ob die Eigenschaftsdefinition erfolgreich war

MitObject.defineProperty, das ein Objekt zurückgibt, wenn erfolgreich, oder andernfalls einenTypeError auslöst, würden Sie einentry...catch Block verwenden, um jeden Fehler abzufangen, der während der Definition einer Eigenschaft aufgetreten ist. DaReflect.defineProperty() einen booleschen Erfolgsstatus zurückgibt, können Sie hier einfach einenif...else Block verwenden:

js
if (Reflect.defineProperty(target, property, attributes)) {  // success} else {  // failure}

Help improve MDN

Learn how to contribute Diese Seite wurde automatisch aus dem Englischen übersetzt.

[8]ページ先頭

©2009-2025 Movatter.jp