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 |
浏览器兼容性
加载中…