Object.defineProperty()
方法是 JavaScript 中用于直接在一个对象上定义一个新属性,或者修改一个对象的现有属性,并返回这个对象的方法。这个方法允许你精确地添加或修改对象的属性,包括属性的值、是否可枚举(enumerable)、是否可配置(configurable)以及是否可写(writable)。
语法
Object.defineProperty(obj, prop, descriptor)
obj
:要定义属性的对象。prop
:要定义或修改的属性的名称。descriptor
:属性描述符。它是一个对象,可以包含以下一些或全部属性:value
:属性的值。可以是任何有效的 JavaScript 值(数字、字符串、对象等)。writable
:如果为true
,属性的值可以被修改(默认为false
)。configurable
:如果为true
,属性的描述符可以被修改,同时属性也可以被删除(默认为false
)。enumerable
:如果为true
,属性能够在for...in
循环和Object.keys
方法中被枚举(默认为false
)。
示例
let person = {};
// 定义一个不可枚举、不可修改的属性
Object.defineProperty(person, 'name', {
value: 'Alice',
writable: false,
enumerable: false,
configurable: false
});
console.log(person.name); // 输出: Alice
// 尝试修改属性的值(失败,因为 writable 为 false)
person.name = 'Bob';
console.log(person.name); // 仍然输出: Alice
// 尝试删除属性(失败,因为 configurable 为 false)
delete person.name;
console.log(person.name); // 仍然输出: Alice
// 因为 enumerable 为 false,所以属性不会在 for...in 循环中被枚举
for (let key in person) {
console.log(key); // 不会输出 'name'
}
// 但是,Object.getOwnPropertyNames 可以获取到所有属性名,包括不可枚举的属性
console.log(Object.getOwnPropertyNames(person)); // 输出: ['name']
注意事项
- 使用
Object.defineProperty()
定义的属性默认是不可枚举的(enumerable: false
)和不可配置的(configurable: false
),除非你在描述符中显式地设置它们为true
。 - 如果试图修改一个不可配置(
configurable: false
)属性的描述符,或者删除一个不可配置的属性,将会抛出一个TypeError
。 - 对于数据属性(即具有
value
或writable
描述符的属性),get
和set
访问器属性描述符将被忽略;对于访问器属性(即具有get
或set
描述符的属性),value
和writable
将被忽略。如果同时提供了这两组属性,则只有访问器属性会被考虑。