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.
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 inObject.prototype.toString()
verwendet.
Statische Methoden
Reflect.apply()
-
Ruft eine
target
-Funktion mit den durch den ParameterargumentsList
angegebenen Argumenten auf. Siehe auchFunction.prototype.apply()
. Reflect.construct()
-
Der
new
-Operator als Funktion. Entspricht dem Aufruf vonnew target(...argumentsList)
. Bietet zudem die Möglichkeit, ein anderes Prototyp zu spezifizieren. Reflect.defineProperty()
-
Ähnlich wie
Object.defineProperty()
. Gibt einen booleschen Wert zurück, dertrue
ist, wenn die Eigenschaft erfolgreich definiert wurde. Reflect.deleteProperty()
-
Der
delete
-Operator als Funktion. Entspricht dem Aufruf vondelete 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, anderenfallsundefined
. 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, dertrue
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, dertrue
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
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
Reflect.ownKeys(duck);
// [ "name", "color", "greeting" ]
Hinzufügen einer neuen Eigenschaft zum Objekt
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