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

浏览器兼容性

另见