当configurable: false时,writable只能从true改为false,不可逆向修改,且其他描述符亦不可调整;其可逆性完全依赖configurable是否为true,故真正只读需同时设writable: false和configurable: false。

当 configurable: false 时,writable 的修改权限被实质性锁定——只能从 true 改为 false,但不能再改回 true,也不能再调整其他描述符。这不是“限制赋值”,而是冻结了属性定义本身。
configurable: false 后 writable 只能单向降级
一旦属性的 configurable 设为 false,它的 writable 状态就进入“只减不增”模式:
- 若当前
writable: true,仍可用Object.defineProperty将其设为false - 若当前
writable: false,任何试图把它改回true的操作都会报错 - 这个单向性是硬性约束,与严格模式无关,也无法绕过
为什么 writable 的可逆性依赖 configurable
writable 本身不具备“开关重置”能力,它只是个状态标记;真正决定能否修改这个标记的,是 configurable:
-
configurable: true→ 可随时用defineProperty切换writable的真假 -
configurable: false→writable被“固化”,连同enumerable和configurable自身一起锁死 - 所以常看到安全配置项同时设
{ writable: false, configurable: false },就是为彻底封住写入和重定义两条路
实际中容易踩的坑
很多开发者误以为设了 writable: false 就万事大吉,却忽略了 configurable 默认值带来的风险:
- 对象字面量直接赋值(如
obj.x = 1)创建的属性,默认configurable: true,哪怕writable: false,也能被后续defineProperty改回可写 - 用
Object.defineProperty但没显式写configurable,默认值是false,容易导致意外锁死 - 想后期开放写权限?必须在初始定义时就明确写
configurable: true,否则不可逆
和 Object.freeze 的区别
Object.freeze(obj) 相当于对所有自有属性批量执行:
-
configurable: false(禁删、禁改描述符) -
writable: false(禁改值)
但它是一次性整对象操作,无法单独放开某几个属性;而手动设置 configurable: false 更精细——只锁特定字段,其余属性照常可扩展、可修改。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











