value仅在数据属性中生效,定义读取返回值和写入存储值;若存在get/set则被忽略;其写入受writable和对象extensible状态约束;它是描述符快照而非内存引用;配合writable:false和configurable:false可创建真正只读常量。

在 JavaScript 中,value 是属性描述符(property descriptor)中最基础的字段之一,它直接决定了对象属性“读取时返回什么”和“写入时存什么”。但它不是万能的——它的行为受其他描述符(尤其是 writable、get/set)严格约束。理解 value 的底层作用机制,是掌握对象属性控制权的关键。
value 只在数据属性中生效
value 仅对“数据属性”(data property)有意义;一旦属性定义了 get 或 set,它就变成“访问器属性”(accessor property),此时 value 和 writable 会被忽略,即使你显式传入也不会报错,但完全不生效。
- ✅ 正确使用:
Object.defineProperty(obj, 'x', { value: 42, writable: true })→x是数据属性,value真正承载值 - ❌ 无效写法:
Object.defineProperty(obj, 'y', { value: 100, get() { return 200 } })→value被静默丢弃,实际行为由get决定
value 的写入是否生效,取决于 writable 和 extensible
即使设置了 value,也不能保证后续赋值一定成功。两个关键开关起决定作用:
-
writable: false:该属性不可被重新赋值。尝试obj.prop = newValue在严格模式下抛错,非严格模式下静默失败(值不变) -
对象不可扩展(
Object.preventExtensions()):无法新增属性,但不影响已有属性的value修改(只要writable: true) - 若同时
configurable: false且writable: false,则value彻底固化,连defineProperty都不能再改(除非先改writable,但此时已不允许)
value 不是“存储位置”,而是描述符快照的一部分
value 并不指向某个内存地址或引用容器;它是在调用 defineProperty 或 create 时,把当前值“快照”进属性内部描述结构。后续读取时,引擎根据描述符类型决定返回逻辑:
- 数据属性:直接返回该快照值(若
writable: true,赋值会更新这个快照) - 访问器属性:忽略快照,每次调用
get函数动态计算 - 注意:
value可以是任意类型(包括对象、函数、undefined),但若为对象,它只是引用值的拷贝,不是深拷贝
用 value 实现只读常量(简单可靠)
相比用 const 声明变量,用 value + writable: false + configurable: false 可在对象层面创建真正不可篡改的属性:
Object.defineProperty(obj, 'PI', { value: Math.PI, writable: false, enumerable: true, configurable: false })- 这样定义后,
obj.PI = 3失败,delete obj.PI失败,Object.defineProperty(obj, 'PI', ...)也会报错 - 这是 ES5 时代模拟
const对象属性的标准方式,至今在冻结配置、构建不可变状态时仍很实用
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











