Start · Sprachen · JavaScript · Referenz · Reflect

Reflect

Klasse

Das <code>Reflect</code>-Namespace-Objekt enthält statische Methoden zum Aufrufen abfangbarer JavaScript-Objekt-Internmethoden.

seit JavaScript ES2015 Kategorie: core

Signatur

Reflect

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 in Object.prototype.toString() verwendet.

Statische Methoden:

  • Reflect.apply(): Ruft eine target-Funktion mit den durch den Parameter argumentsList angegebenen Argumenten auf. Siehe auch Function.prototype.apply().
  • Reflect.construct(): Der new-Operator als Funktion. Äquivalent zum Aufruf von new target(...argumentsList). Bietet auch die Möglichkeit, einen anderen Prototyp anzugeben.
  • Reflect.defineProperty(): Ähnlich wie Object.defineProperty(). Gibt einen boolean zurück, der true ist, wenn die Eigenschaft erfolgreich definiert wurde.
  • Reflect.deleteProperty(): Der delete-Operator als Funktion. Äquivalent zum Aufruf von delete 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 wie Object.getOwnPropertyDescriptor(). Gibt einen property descriptor der angegebenen Eigenschaft zurück, falls sie auf dem Objekt existiert, sonst undefined.
  • Reflect.getPrototypeOf(): Dasselbe wie Object.getPrototypeOf().
  • Reflect.has(): Gibt einen boolean zurück, der angibt, ob das Ziel die Eigenschaft besitzt. Entweder als eigene oder geerbte. Funktioniert wie der in-Operator als Funktion.
  • Reflect.isExtensible(): Dasselbe wie Object.isExtensible(). Gibt einen boolean zurück, der true ist, wenn das Ziel erweiterbar ist.
  • Reflect.ownKeys(): Gibt ein Array der eigenen (nicht geerbten) Eigenschafts-Keys des Zielobjekts zurück.
  • Reflect.preventExtensions(): Ähnlich wie Object.preventExtensions(). Gibt einen boolean zurück, der true ist, wenn die Aktualisierung erfolgreich war.
  • Reflect.set(): Eine Funktion, die Werte an Eigenschaften zuweist. Gibt einen boolean zurück, der true ist, wenn die Aktualisierung erfolgreich war.
  • Reflect.setPrototypeOf(): Eine Funktion, die den Prototyp eines Objekts setzt. Gibt einen boolean zurück, der true ist, wenn die Aktualisierung erfolgreich war.

Rückgabewert

Typ
void
Beschreibung
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.

Siehe auch