📅  最后修改于: 2023-12-03 14:42:28.390000             🧑  作者: Mango
Reflect.defineProperty() 方法是 ECMAScript2015 中引入的反射 API 之一,它允许我们在对象上定义一个新的属性或修改一个现有属性的属性描述符(attribute descriptor)。
Reflect.defineProperty(target, propertyKey, attributes)
参数说明:
返回值:返回一个布尔值,表示是否成功定义属性。
在使用 Reflect.defineProperty() 定义属性时,我们需要传入 attributes 参数,这个参数必须是一个属性描述符对象,用来描述要定义的属性的各种属性值(如可写、可枚举、可配置等等)。
属性描述符对象有以下可选属性:
configurable
:当且仅当该属性描述符对象特性为 true 时,该属性描述符才能够被改变(即可以被删除 或可以重新被定义)。默认为 false。enumerable
:当且仅当该属性描述符对象特性为 true 时,该属性才会出现在对象属性枚举中。默认为 false。value
:表示设置该属性的值。默认为 undefined。writable
:当且仅当该属性描述符对象特性为 true 时,该属性的值才可以被赋值运算符改变。默认为 false。get
:一个获取该属性值的函数(getter),访问该属性时会调用此方法。默认为 undefined。set
:一个设置该属性值的函数(setter),设置该属性值时会调用此方法。默认为 undefined。// 定义一个对象
let obj = {
name: 'John',
age: 30
};
// 定义一个新的属性 birthday,使用属性描述符对象来设置属性的相关属性
Reflect.defineProperty(obj, 'birthday', {
value: '1990/01/01',
writable: false,
enumerable: true,
configurable: false
});
// 读取定义的新属性
console.log(obj.birthday); // '1990/01/01'
// 尝试修改该属性的值
obj.birthday = '2000/01/01'; // 定义时 writable 为 false,修改操作会失败
// 遍历属性
for (let property in obj) {
console.log(property); // 'name', 'age', 'birthday'
}