Reflect.defineProperty()
靜態方法 Reflect.defineProperty() 類似於 Object.defineProperty(),但它返回一個 Boolean 值。
試一試
const object = {};
if (Reflect.defineProperty(object, "foo", { value: 42 })) {
console.log("foo created!");
// Expected output: "foo created!"
} else {
console.log("problem creating foo");
}
console.log(object.foo);
// Expected output: 42
語法
js
Reflect.defineProperty(target, propertyKey, attributes)
引數
目標-
要在其上定義屬性的目標物件。
propertyKey-
要定義或修改的屬性的名稱。
attributes-
正在定義或修改的屬性的屬性描述符。
返回值
一個布林值,指示屬性是否已成功定義。
異常
TypeError-
如果
target或attributes不是物件,則丟擲此錯誤。
描述
Reflect.defineProperty() 提供了在物件上定義自身屬性的反射語義。在非常低的層面上,定義屬性會返回一個布林值(就像 代理處理程式 那樣)。 Object.defineProperty() 提供了幾乎相同的語義,但如果狀態為 false(操作不成功),它會丟擲 TypeError,而 Reflect.defineProperty() 則直接返回狀態。
許多內建操作也會在物件上定義自身屬性。定義屬性和 設定 屬性之間最顯著的區別在於,setter 不會被呼叫。例如,類欄位 直接在例項上定義屬性,而不會呼叫 setter。
js
class B extends class A {
set a(v) {
console.log("Setter called");
}
} {
a = 1; // Nothing logged
}
Reflect.defineProperty() 呼叫 target 的 [[DefineOwnProperty]] 物件內部方法。
示例
使用 Reflect.defineProperty()
js
const obj = {};
Reflect.defineProperty(obj, "x", { value: 7 }); // true
console.log(obj.x); // 7
檢查屬性定義是否成功
使用 Object.defineProperty(),它在成功時返回一個物件,否則丟擲 TypeError,您需要使用 try...catch 塊來捕獲定義屬性時發生的任何錯誤。
因為 Reflect.defineProperty() 返回一個布林成功狀態,所以您可以在這裡只使用一個 if...else 塊。
js
if (Reflect.defineProperty(target, property, attributes)) {
// success
} else {
// failure
}
規範
| 規範 |
|---|
| ECMAScript® 2026 語言規範 # sec-reflect.defineproperty |
瀏覽器相容性
載入中…