writable: false 时属性值不可赋值,严格模式报错、非严格模式静默失败;仅限制直接赋值,不阻止 defineproperty 修改描述符(需 configurable: true);与 const 作用层级不同;可用 getownpropertydescriptor 检测,修改 writable 需 configurable 为 true;不能冻结整个对象,需用 preventextensions/seal/freeze。

当属性的 writable 描述符设为 false 时,该属性值无法被重新赋值——在严格模式下会直接报错,非严格模式下赋值操作静默失败(不报错但也不生效)。
writable: false 时的赋值表现
该限制只作用于直接对属性的赋值操作(obj.prop = newValue),不影响通过 Object.defineProperty 或 Object.defineProperties 修改描述符本身(前提是 configurable 为 true)。
- 非严格模式:
obj.x = 100不报错,但obj.x值不变,仍为原值 - 严格模式:
obj.x = 100抛出TypeError: Cannot assign to read only property 'x' - 使用
Object.defineProperty(obj, 'x', { value: 200 })会失败(除非同时设writable: true或先改configurable: true)
与 const 声明的区别
writable: false 是对象属性级别的写保护,而 const 是绑定级别的不可重新赋值。两者作用对象不同:
-
const obj = { x: 1 }:obj绑定不可变,但obj.x = 2仍可成功(除非x属性本身writable: false) -
Object.defineProperty(obj, 'x', { value: 1, writable: false }):禁止修改obj.x的值,无论是否用const声明obj
如何检测和修改 writable 状态
用 Object.getOwnPropertyDescriptor 查看当前描述符;修改需满足前提条件:
-
Object.getOwnPropertyDescriptor(obj, 'prop')返回对象含writable字段 - 若
configurable: true,可用Object.defineProperty将writable从false改为true - 若
configurable: false,则writable永久锁定,无法再改为true
常见误用场景
开发者有时误以为设了 writable: false 就能“冻结整个对象”,其实它只保护单个属性:
-
obj.a = 1失败(a的writable: false),但obj.b = 2仍可能成功(b未定义或writable: true) - 要真正防止新增/修改/删除属性,应使用
Object.preventExtensions、Object.seal或Object.freeze -
Object.freeze(obj)会将所有自有属性设为writable: false且configurable: false
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











