Reflect.defineProperty()

Baseline 已廣泛支援

此特性已非常成熟,可在多種裝置和瀏覽器版本上使用。自 ⁨2016 年 9 月⁩以來,它已在各大瀏覽器中可用。

靜態方法 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

如果 targetattributes 不是物件,則丟擲此錯誤。

描述

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

瀏覽器相容性

另見