Reflect.defineProperty()
**Reflect.defineProperty()
** 静态方法类似于 Object.defineProperty()
,但返回一个 Boolean
。
试一试
语法
js
Reflect.defineProperty(target, propertyKey, attributes)
参数
target
-
要定义属性的目标对象。
propertyKey
-
要定义或修改的属性的名称。
attributes
-
要定义或修改的属性的属性。
返回值
一个布尔值,指示属性是否成功定义。
异常
TypeError
-
如果
target
或attributes
不是对象,则抛出此异常。
描述
Reflect.defineProperty()
提供了在对象上定义自有属性的反射语义。在最底层,定义属性返回一个布尔值(就像 代理处理程序 一样)。Object.defineProperty()
提供了几乎相同的语义,但如果状态为false
(操作不成功),则会抛出 TypeError
,而 Reflect.defineProperty()
直接返回状态。
许多内置操作也会在对象上定义自有属性。定义属性和 设置 属性之间最显著的区别在于,设置器 不会被调用。例如,类字段 直接在实例上定义属性,而不会调用设置器。
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 语言规范 # sec-reflect.defineproperty |
浏览器兼容性
BCD 表格仅在启用了 JavaScript 的浏览器中加载。