Reflect.defineProperty()
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.
Die statische Methode Reflect.defineProperty()
ist wie Object.defineProperty()
, gibt jedoch einen Boolean
zurück.
Probieren Sie es aus
Syntax
Reflect.defineProperty(target, propertyKey, attributes)
Parameter
target
-
Das Zielobjekt, auf dem die Eigenschaft definiert werden soll.
propertyKey
-
Der Name der zu definierenden oder zu ändernden Eigenschaft.
attributes
-
Die Attribute für die zu definierende oder zu ändernde Eigenschaft.
Rückgabewert
Ein Boolean, der angibt, ob die Eigenschaft erfolgreich definiert wurde oder nicht.
Ausnahmen
TypeError
-
Wird ausgelöst, wenn
target
oderattributes
kein Objekt ist.
Beschreibung
Reflect.defineProperty()
bietet die reflektierende Semantik der Definition einer eigenen Eigenschaft auf einem Objekt. Auf sehr niedriger Ebene gibt die Definition einer Eigenschaft einen Boolean zurück (wie es der Fall mit dem Proxy-Handler ist). Object.defineProperty()
bietet nahezu die gleiche Semantik, löst jedoch einen TypeError
aus, wenn der Status false
ist (die Operation war nicht erfolgreich), während Reflect.defineProperty()
den Status direkt zurückgibt.
Viele eingebaute Operationen würden auch eigene Eigenschaften auf Objekten definieren. Der bedeutendste Unterschied zwischen der Definition von Eigenschaften und dem Setzen von ihnen ist, dass Setter nicht aufgerufen werden. Beispielsweise definieren Klassenfelder direkt Eigenschaften auf der Instanz, ohne Setter aufzurufen.
class B extends class A {
set a(v) {
console.log("Setter called");
}
} {
a = 1; // Nothing logged
}
Reflect.defineProperty()
ruft die [[DefineOwnProperty]]
objektinterne Methode von target
auf.
Beispiele
Verwendung von Reflect.defineProperty()
const obj = {};
Reflect.defineProperty(obj, "x", { value: 7 }); // true
console.log(obj.x); // 7
Überprüfen, ob die Eigenschaftsdefinition erfolgreich war
Mit Object.defineProperty()
, das ein Objekt zurückgibt, wenn es erfolgreich ist, oder andernfalls einen TypeError
auslöst, würden Sie einen try...catch
-Block verwenden, um jeden Fehler abzufangen, der beim Definieren einer Eigenschaft aufgetreten ist.
Da Reflect.defineProperty()
einen Boolean-Erfolgsstatus zurückgibt, können Sie hier einfach einen if...else
-Block verwenden:
if (Reflect.defineProperty(target, property, attributes)) {
// success
} else {
// failure
}
Spezifikationen
Specification |
---|
ECMAScript Language Specification # sec-reflect.defineproperty |
Browser-Kompatibilität
BCD tables only load in the browser