Reflect

Baseline Widely available

This feature is well established and works across many devices and browser versions. It’s been available across browsers since September 2016.

Das Reflect Namespace-Objekt enthält statische Methoden zum Aufrufen von abfangbaren internen JavaScript-Objektmethoden. Die Methoden sind dieselben wie die der Proxy-Handler.

Beschreibung

Im Gegensatz zu den meisten globalen Objekten ist Reflect kein Konstruktor. Sie können es weder mit dem new-Operator verwenden noch das Reflect-Objekt als Funktion aufrufen. Alle Eigenschaften und Methoden von Reflect sind statisch (genau wie das Math-Objekt).

Das Reflect-Objekt bietet eine Sammlung statischer Funktionen, die dieselben Namen wie die Proxy-Handler-Methoden haben.

Der Hauptanwendungsfall von Reflect besteht darin, ein Standardweiterleitungsverhalten in Proxy-Handler-Fallen bereitzustellen. Eine Falle wird verwendet, um eine Operation an einem Objekt abzufangen — sie bietet eine benutzerdefinierte Implementierung für eine interne Objektmethode. Die Reflect-API wird verwendet, um die entsprechende interne Methode auszuführen. Zum Beispiel erstellt der folgende Code einen Proxy p mit einer deleteProperty-Falle, die die interne Methode [[Delete]] abfängt. Reflect.deleteProperty() wird verwendet, um das Standardverhalten [[Delete]] direkt am targetObject auszuführen. Sie können es mit delete ersetzen, aber die Verwendung von Reflect erspart Ihnen, sich die Syntax zu merken, die jeder internen Methode entspricht.

js
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);
    },
  },
);

Die Reflect-Methoden ermöglichen auch eine feinere Kontrolle darüber, wie die interne Methode aufgerufen wird. Beispielsweise ist Reflect.construct() der einzige Weg, um eine Ziel-Funktion mit einem bestimmten new.target-Wert zu konstruieren. Wenn Sie den new-Operator verwenden, um eine Funktion aufzurufen, ist der new.target-Wert immer die Funktion selbst. Dies hat wichtige Auswirkungen beim Subklassieren. Ein weiteres Beispiel ist Reflect.get(), welches es Ihnen ermöglicht, einen Getter mit einem benutzerdefinierten this-Wert auszuführen, während Eigenschafts-Accessor immer das aktuelle Objekt als this-Wert verwenden.

Das Verhalten fast jeder Reflect-Methode kann mit einer anderen Syntax oder Methode erreicht werden. Einige dieser Methoden haben entsprechende statische Methoden gleichen Namens in Object, obwohl sie einige subtile Unterschiede aufweisen. Für die genauen Unterschiede siehe die Beschreibung für jede Reflect-Methode.

Statische Eigenschaften

Reflect[Symbol.toStringTag]

Der Anfangswert der [Symbol.toStringTag]-Eigenschaft 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. Entspricht dem Aufruf von new target(...argumentsList). Bietet zudem die Möglichkeit, ein anderes Prototyp zu spezifizieren.

Reflect.defineProperty()

Ähnlich wie Object.defineProperty(). Gibt einen booleschen Wert zurück, der true ist, wenn die Eigenschaft erfolgreich definiert wurde.

Reflect.deleteProperty()

Der delete-Operator als Funktion. Entspricht dem Aufruf von delete target[propertyKey].

Reflect.get()

Gibt den Wert der Eigenschaft zurück. Funktioniert wie das Abrufen einer Eigenschaft aus einem Objekt (target[propertyKey]) als Funktion.

Reflect.getOwnPropertyDescriptor()

Ähnlich wie Object.getOwnPropertyDescriptor(). Gibt einen Eigenschafts-Deskriptor der angegebenen Eigenschaft zurück, wenn sie auf dem Objekt existiert, anderenfalls undefined.

Reflect.getPrototypeOf()

Entspricht Object.getPrototypeOf().

Reflect.has()

Gibt einen booleschen Wert zurück, der angibt, ob das target die Eigenschaft entweder als eigene oder geerbte Eigenschaft hat. Funktioniert wie der in-Operator als Funktion.

Reflect.isExtensible()

Entspricht Object.isExtensible(). Gibt einen booleschen Wert zurück, der true ist, wenn das Ziel erweiterbar ist.

Reflect.ownKeys()

Gibt ein Array der eigenen (nicht geerbten) Eigenschaftsschlüssel des Zielobjekts zurück.

Reflect.preventExtensions()

Ähnlich wie Object.preventExtensions(). Gibt einen booleschen Wert zurück, der true ist, wenn das Update erfolgreich war.

Reflect.set()

Eine Funktion, die Werte für Eigenschaften zuweist. Gibt einen booleschen Wert zurück, der true ist, wenn das Update erfolgreich war.

Reflect.setPrototypeOf()

Eine Funktion, die das Prototyp eines Objekts setzt. Gibt einen booleschen Wert zurück, der true ist, wenn das Update erfolgreich war.

Beispiele

Erkennen, ob ein Objekt bestimmte Eigenschaften enthält

js
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

Rückgabe der eigenen Schlüssel des Objekts

js
Reflect.ownKeys(duck);
// [ "name", "color", "greeting" ]

Hinzufügen einer neuen Eigenschaft zum Objekt

js
Reflect.set(duck, "eyes", "black");
// returns "true" if successful
// "duck" now contains the property "eyes: 'black'"

Spezifikationen

Specification
ECMAScript® 2025 Language Specification
# sec-reflect-object

Browser-Kompatibilität

Report problems with this compatibility data on GitHub
desktopmobileserver
Chrome
Edge
Firefox
Opera
Safari
Chrome Android
Firefox for Android
Opera Android
Safari on iOS
Samsung Internet
WebView Android
WebView on iOS
Deno
Node.js
Reflect
apply
construct
defineProperty
deleteProperty
get
getOwnPropertyDescriptor
getPrototypeOf
has
isExtensible
ownKeys
preventExtensions
set
setPrototypeOf

Legend

Tip: you can click/tap on a cell for more information.

Full support
Full support

Siehe auch