Object.defineProperty

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
  • 对于数据属性(即具有 valuewritable 描述符的属性),getset 访问器属性描述符将被忽略;对于访问器属性(即具有 getset 描述符的属性),valuewritable 将被忽略。如果同时提供了这两组属性,则只有访问器属性会被考虑。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值