writable 的修改受限于 configurable 状态:仅当 configurable 为 true 时,writable 才可从 false 改为 true;configurable 为 false 时,writable 永久锁定为 false(除非原为 true,可改为 false)。

是的,writable 的修改直接受限于 configurable 状态。不能单独改变 writable,必须先确认 configurable 是否允许该操作。
writable 只能在 configurable: true 时被重新设为 true
一旦 writable 被设为 false,后续想把它改回 true,前提是 configurable 必须为 true。否则会报错:
- configurable: true → 可以用 Object.defineProperty 把 writable 从 false 改成 true
- configurable: false → writable 永久锁定为 false,无法恢复可写
- 即使 writable 是 false,只要 configurable 是 true,仍可调用 defineProperty 修改 value(需配合 writable: true 或直接设新 value + writable: true)
configurable: false 时的唯一例外
当 configurable 为 false,writable 仍处于 true 状态时,允许将其改为 false —— 这是唯一被允许的反向修改:
Java JDK 25 来自 OpenJDK 官方归档,版本为 JDK 25,本条下载地址已指向官方 Windows x64 zip 安装包直链,适合调试旧项目或兼容旧版 Java 运行环境。
- Object.defineProperty(obj, 'x', { writable: false }) ✅ 允许(原 writable: true)
- Object.defineProperty(obj, 'x', { writable: true }) ❌ 报错(原 writable: false)
如何判断能否修改 writable
先用 Object.getOwnPropertyDescriptor 检查当前描述符:
- 若返回对象中 configurable === false 且 writable === false,则 writable 已不可逆
- 若 configurable === true,无论当前 writable 是 true 还是 false,都可通过 defineProperty 调整其值
- 注意:defineProperty 修改 writable 时,不能同时修改其他字段(如 enumerable),除非 configurable: true
常见误区提醒
很多人以为设了 writable: false 就“锁死属性”,其实它只是写保护;真正决定能否后期调整 writable 的,是 configurable:
- Object.freeze() 冻结对象时,会把所有自有属性的 writable 和 configurable 都设为 false → 完全不可改
- 仅设 writable: false 而不设 configurable: true,等于主动放弃未来开放写权限的机会
- 字面量创建的属性默认 configurable: true;而 defineProperty 添加的属性默认 configurable: false —— 这点容易被忽略
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










