writable 是 JavaScript 属性描述符中控制属性是否可赋值的布尔标志,设为 false 后赋值被引擎拦截,读取、枚举、删除不受影响,需通过 Object.defineProperty 显式设置且受 configurable 是否可逆限制。

writable 是 JavaScript 属性描述符中的一个布尔标志,它直接控制该属性的值是否能被重新赋值——设为 false 后,任何直接赋值操作都会被引擎拦截,但读取、枚举、删除等行为不受影响。
作用:精准锁定单个属性的写权限
它不是靠约定或注释“提醒”开发者别改,而是由 JS 引擎在运行时强制执行的底层保护机制:
- 只对赋值动作(
obj.prop = newValue)生效,不影响console.log(obj.prop)或for...in遍历 - 不阻止属性被删除(那是
configurable的职责),也不隐藏属性(那是enumerable的职责) - 适用于关键字段保护,比如 API 地址、版本号、初始状态标识,无需冻结整个对象
实现原理:依赖数据属性的 [[Writable]] 内部特性
每个数据属性背后都有一组不可见的内部特性([[Value]]、[[Writable]]、[[Enumerable]]、[[Configurable]])。writable: false 实际就是把 [[Writable]] 设为 false,JS 引擎在执行赋值前会检查这个标志:
- 若为
false,则跳过值更新,非严格模式下静默忽略,严格模式下立即抛TypeError - 该检查发生在赋值语句执行阶段,与变量声明(
const)、对象冻结(Object.freeze)无关,作用层级不同 - 必须通过
Object.defineProperty()显式设置;对象字面量中声明的属性默认writable: true且无法事后修改
关键细节:configurable 决定 writable 是否可逆
writable 锁定后默认不可撤销,但可通过 configurable: true 预留调整空间:
立即学习“Java免费学习笔记(深入)”;
- 定义时没设
configurable: true→ 后续无法用defineProperty把writable改回true - 定义时显式加
configurable: true→ 后续可再次调用defineProperty开放写权限(唯一允许的修改) - 一旦
configurable: false,就彻底封死所有描述符修改和delete操作
常见误区澄清
避免混淆几个相似但不同层级的概念:
-
const obj = { x: 1 }:只防止obj变量被重新赋值,obj.x = 2依然有效 -
Object.freeze(obj):批量将所有自有属性设为writable: false且configurable: false,不可逆、副作用大 -
writable: false:轻量、单点、可配置,适合局部防护


















