js 属性描述符

在 JavaScript 中,每个对象的属性都有一个与之关联的 属性描述符(Property Descriptor),它定义了属性的行为。属性描述符分为两种类型:

  1. 数据描述符(Data Descriptor):包含属性的值和一些控制属性的行为的标志。
  2. 访问器描述符(Accessor Descriptor):定义属性的 gettersetter

你可以使用 Object.getOwnPropertyDescriptor 方法来查看某个属性的描述符,或者使用 Object.definePropertyObject.defineProperties 方法来设置属性描述符。


数据描述符

数据描述符包含以下字段:

  • value:属性的值。
  • writable:是否可以修改属性的值。
  • enumerable:属性是否可枚举(可以通过 for...inObject.keys 遍历)。
  • configurable:属性是否可以被删除或修改描述符。
示例
const obj = {};

Object.defineProperty(obj, 'name', {
    value: 'John Doe',
    writable: false,       // 不允许修改值
    enumerable: true,      // 可以枚举
    configurable: true     // 允许删除或修改描述符
});

console.log(obj.name); // 输出: John Doe
obj.name = 'Jane Doe'; // 无效,因为 writable 为 false
console.log(obj.name); // 输出: John Doe


访问器描述符

访问器描述符包含以下字段:

  • get:一个函数,当访问属性时调用。
  • set:一个函数,当设置属性时调用。
  • enumerable:属性是否可枚举。
  • configurable:属性是否可以被删除或修改描述符。
示例
const obj = {};

Object.defineProperty(obj, 'fullName', {
    get() {
        return `${this.firstName} ${this.lastName}`;
    },
    set(value) {
        [this.firstName, this.lastName] = value.split(' ');
    },
    enumerable: true,      // 可以枚举
    configurable: true     // 允许删除或修改描述符
});

obj.firstName = 'John';
obj.lastName = 'Doe';
console.log(obj.fullName); // 输出: John Doe

obj.fullName = 'Jane Smith';
console.log(obj.firstName); // 输出: Jane
console.log(obj.lastName);  // 输出: Smith

查看属性描述符

你可以使用 Object.getOwnPropertyDescriptor 方法查看某个属性的描述符。

示例

定义多个属性

你可以使用 Object.defineProperties 一次性定义多个属性。

示例
const obj = {};

Object.defineProperties(obj, {
    firstName: {
        value: 'John',
        writable: true,
        enumerable: true,
        configurable: true
    },
    lastName: {
        value: 'Doe',
        writable: true,
        enumerable: true,
        configurable: true
    },
    fullName: {
        get() {
            return `${this.firstName} ${this.lastName}`;
        },
        enumerable: true,
        configurable: true
    }
});

console.log(obj.fullName); // 输出: John Doe

总结

  • 属性描述符可以控制属性的行为,如是否可修改、是否可枚举等。
  • 数据描述符和访问器描述符不能同时存在。
  • 使用 Object.definePropertyObject.defineProperties 可以精确控制对象属性的行为。
  • 使用 Object.getOwnPropertyDescriptor 可以查看属性的描述符。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值