JavaScript对象属性描述符定义属性行为,分数据描述符(含value/writable)和存取器描述符(含get/set),二者互斥;configurable、enumerable、writable控制删除、遍历与赋值,value或get/set决定存值方式。

JavaScript对象属性描述符是用来定义和控制对象属性行为的一组配置项,它决定了属性是否可读、可写、可枚举、可配置,以及它的值或存取器函数。
数据描述符和存取器描述符
属性描述符分为两类:数据描述符(data descriptor)和存取器描述符(accessor descriptor)。二者互斥,不能混用。
- 数据描述符包含 value 和 writable,还可选 enumerable 和 configurable
- 存取器描述符包含 get 和/或 set,同样可选 enumerable 和 configurable
- 使用 Object.defineProperty() 或 Object.defineProperties() 设置描述符时,若不显式指定,默认值为 false(比如 writable、enumerable、configurable)
四个关键布尔属性的作用
所有描述符都可能包含以下四个布尔型配置项,它们控制属性的底层行为:
- configurable:为 false 时,该属性不能被删除,也不能再修改描述符(如从数据描述符改存取器),Object.defineProperty() 会报错
- enumerable:为 false 时,该属性不会出现在 for...in 循环、Object.keys() 或 JSON.stringify() 中
- writable:仅对数据描述符有效;为 false 时,value 不可被重新赋值(严格模式下赋值会静默失败或抛错)
- value 或 get/set:决定属性是直接持有值,还是通过函数动态读写
如何查看和设置描述符
用 Object.getOwnPropertyDescriptor() 查看单个属性的完整描述符;用 Object.getOwnPropertyDescriptors() 获取整个对象所有自有属性的描述符对象。
立即学习“Java免费学习笔记(深入)”;
- 例如:Object.getOwnPropertyDescriptor(obj, 'name') 返回类似
{ value: 'Alice', writable: true, enumerable: true, configurable: true } - 冻结对象(Object.freeze())本质是将所有现有属性设为 writable: false 和 configurable: false
- 注意:普通对象字面量创建的属性默认都是可配置、可枚举、可写的;但通过 defineProperty 显式添加的属性,未声明的字段默认为 false
实际中容易忽略的细节
描述符不是“装饰”,而是直接影响 JavaScript 引擎对属性的操作逻辑。一些看似简单的操作背后依赖描述符规则:
- 解构赋值、扩展运算符(...)只遍历 enumerable: true 的自有属性
- Object.assign() 只拷贝可枚举且可写的属性,不复制 get/set
- 类中定义的实例方法默认 enumerable: false,所以不会被 for...in 遍历到
- 一旦 configurable: false,即使 writable: true,也无法再把属性改成存取器——这是单向锁










