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 Language Specification
# sec-reflect-object

Browser-Kompatibilität

BCD tables only load in the browser

Siehe auch