Signatur
Beschreibung
Das Reflect-Namespace-Objekt enthält statische Methoden zum Aufrufen abfangbarer JavaScript-Objekt-Internmethoden. Die Methoden sind dieselben wie die der proxy handlers.
Anders als die meisten globalen Objekte ist Reflect kein Konstruktor. Sie können es nicht mit dem new-Operator verwenden oder das Reflect-Objekt als Funktion aufrufen. Alle Eigenschaften und Methoden von Reflect sind statisch (genau wie beim Math-Objekt).
Das Reflect-Objekt stellt eine Sammlung statischer Funktionen bereit, die dieselben Namen wie die proxy handler-Methoden haben.
Der Haupt-Anwendungsfall von Reflect ist es, ein Standard-Weiterleitungsverhalten in Proxy-Handler-Traps bereitzustellen. Ein trap wird verwendet, um eine Operation auf einem Objekt abzufangen — er stellt eine benutzerdefinierte Implementierung für eine Objekt-Internmethode bereit. Die Reflect-API wird verwendet, um die entsprechende Internmethode aufzurufen. Beispielsweise erstellt der folgende Code einen Proxy p mit einem deleteProperty-trap, der die interne Methode [[Delete]] abfängt. Reflect.deleteProperty() wird verwendet, um das Standardverhalten von [[Delete]] direkt auf targetObject auszuführen. Sie können es durch delete ersetzen, aber die Verwendung von Reflect erspart Ihnen, sich merken zu müssen, welche Syntax jeder Internmethode entspricht.
Die Reflect-Methoden erlauben auch eine feinere Kontrolle darüber, wie die Internmethode aufgerufen wird. Beispielsweise ist Reflect.construct() die einzige Möglichkeit, eine Zielfunktion mit einem spezifischen new.target-Wert zu konstruieren. Wenn Sie den new-Operator zum Aufrufen einer Funktion verwenden, ist der new.target-Wert immer die Funktion selbst. Dies hat wichtige Auswirkungen bei der Bildung von Subklassen. Ein weiteres Beispiel: Reflect.get() erlaubt Ihnen, einen getter mit einem benutzerdefinierten this-Wert auszuführen, während property accessors immer das aktuelle Objekt als this-Wert verwenden.
Nahezu jedes Verhalten einer Reflect-Methode kann mit einer anderen Syntax oder Methode erreicht werden. Einige dieser Methoden haben entsprechende statische Methoden gleichen Namens auf Object, obwohl es einige subtile Unterschiede gibt. Für die genauen Unterschiede siehe die Beschreibung jeder Reflect-Methode.
Statische Eigenschaften:
Reflect[Symbol.toStringTag]: Der initiale Wert der Eigenschaft[Symbol.toStringTag]ist der String"Reflect". Diese Eigenschaft wird inObject.prototype.toString()verwendet.
Statische Methoden:
Reflect.apply(): Ruft einetarget-Funktion mit den durch den ParameterargumentsListangegebenen Argumenten auf. Siehe auchFunction.prototype.apply().Reflect.construct(): Dernew-Operator als Funktion. Äquivalent zum Aufruf vonnew target(...argumentsList). Bietet auch die Möglichkeit, einen anderen Prototyp anzugeben.Reflect.defineProperty(): Ähnlich wieObject.defineProperty(). Gibt einen boolean zurück, dertrueist, wenn die Eigenschaft erfolgreich definiert wurde.Reflect.deleteProperty(): Derdelete-Operator als Funktion. Äquivalent zum Aufruf vondelete target[propertyKey].Reflect.get(): Gibt den Wert der Eigenschaft zurück. Funktioniert wie das Auslesen einer Eigenschaft aus einem Objekt (target[propertyKey]) als Funktion.Reflect.getOwnPropertyDescriptor(): Ähnlich wieObject.getOwnPropertyDescriptor(). Gibt einen property descriptor der angegebenen Eigenschaft zurück, falls sie auf dem Objekt existiert, sonstundefined.Reflect.getPrototypeOf(): Dasselbe wieObject.getPrototypeOf().Reflect.has(): Gibt einen boolean zurück, der angibt, ob das Ziel die Eigenschaft besitzt. Entweder als eigene oder geerbte. Funktioniert wie derin-Operator als Funktion.Reflect.isExtensible(): Dasselbe wieObject.isExtensible(). Gibt einen boolean zurück, dertrueist, wenn das Ziel erweiterbar ist.Reflect.ownKeys(): Gibt ein Array der eigenen (nicht geerbten) Eigenschafts-Keys des Zielobjekts zurück.Reflect.preventExtensions(): Ähnlich wieObject.preventExtensions(). Gibt einen boolean zurück, dertrueist, wenn die Aktualisierung erfolgreich war.Reflect.set(): Eine Funktion, die Werte an Eigenschaften zuweist. Gibt einen boolean zurück, dertrueist, wenn die Aktualisierung erfolgreich war.Reflect.setPrototypeOf(): Eine Funktion, die den Prototyp eines Objekts setzt. Gibt einen boolean zurück, dertrueist, wenn die Aktualisierung erfolgreich war.
Rückgabewert
Reflect ist kein Konstruktor und hat keinen eigenen Rückgabewert – es wird nie mit new aufgerufen. Die einzelnen statischen Methoden geben je nach Operation einen booleschen Wert, den abgefragten Eigenschaftswert oder andere Ergebnisse zurück.Beispiele
Erkennen, ob ein Objekt bestimmte Eigenschaften enthält
const duck = {
name: "Maurice",
color: "white",
greeting() {
console.log(`Quaaaack! My name is ${this.name}`);
},
};
Reflect.has(duck, "color");
// true
Reflect.has(duck, "haircut");
// false
Die eigenen Keys des Objekts zurückgeben
Reflect.ownKeys(duck);
// [ "name", "color", "greeting" ]
Eine neue Eigenschaft zum Objekt hinzufügen
Reflect.set(duck, "eyes", "black");
// returns "true" if successful
// "duck" now contains the property "eyes: 'black'"
Standard-Weiterleitungsverhalten in einem Proxy-Trap
const p = new Proxy(
{},
{
deleteProperty(targetObject, property) {
// Custom functionality: log the deletion
console.log("Deleting property:", property);
// Execute the default introspection behavior
return Reflect.deleteProperty(targetObject, property);
},
},
);
// Wichtig · Fallstricke
Kein Konstruktor: Reflect kann nicht mit new Reflect() instanziiert werden und ist kein reguläres Objekt mit Prototyp-Instanzen – der Versuch wirft einen TypeError.
Unterschied zu Object-Methoden: Viele Reflect-Methoden haben ein Gegenstück in Object (z. B. Object.getPrototypeOf vs. Reflect.getPrototypeOf), verhalten sich aber bei Fehlern anders: Reflect-Methoden geben häufig false zurück, während Object-Methoden eine Exception werfen. Das macht Reflect besser geeignet für defensive Metaprogrammierung.
Receiver-Parameter: Bei Reflect.get() und Reflect.set() sollte immer der receiver-Parameter aus dem Proxy-Trap weitergegeben werden, um korrekte Getter/Setter-Semantik zu gewährleisten – insbesondere bei Vererbung.
Browser-Kompatibilität: Reflect wird seit ES2015 von allen modernen Browsern und Node.js-Versionen ab v6 vollständig unterstützt. Für sehr alte Umgebungen (IE11) ist ein Polyfill notwendig.