writable属性描述符控制对象属性值是否可被重新赋值,需通过Object.defineProperty()设置;设为false后属性值锁定,赋值操作静默失败或抛TypeError,且不可逆除非configurable为true。

用 writable 属性描述符可以控制对象属性值是否可被重新赋值。它属于数据属性描述符,必须配合 Object.defineProperty() 或 Object.defineProperties() 使用,直接在字面量中声明的对象属性无法设置该描述符。
设置 writable: false 后属性不可修改
当 writable 设为 false,该属性的值将被锁定,后续任何直接赋值操作都会静默失败(非严格模式)或抛出 TypeError(严格模式)。
- 即使属性存在且可访问,也不能通过
obj.prop = newValue更改其值 - 不会影响属性是否可删除(由
configurable控制),也不会影响是否可枚举(由enumerable控制) - 例如:注意:不能用
obj.x = 2覆盖,但console.log(obj.x)仍能读到原始值
与 const 声明的区别
writable: false 限制的是**对象某个属性的赋值行为**,而 const 声明限制的是**变量绑定不可重新赋值**。两者作用层级不同:
-
const obj = { x: 1 }; obj.x = 2;—— 允许,因为obj的属性默认是可写的 -
Object.defineProperty(obj, 'x', { value: 1, writable: false }); obj.x = 2;—— 不允许,触发写保护 -
const obj = Object.freeze({ x: 1 });—— 等价于对所有自有属性设writable: false+configurable: false
修改 writable 需要 configurable: true
一旦属性的 writable 设为 false,就无法再通过 defineProperty 改回 true,除非同时满足 configurable: true。
立即学习“Java免费学习笔记(深入)”;
- 默认情况下,用
defineProperty添加的属性,configurable是false,所以writable锁定后不可逆 - 若需后期开放写权限,定义时应显式指定
configurable: true - 示例:
Object.defineProperty(obj, 'x', { value: 1, writable: false, configurable: true })→ 后续可再调用defineProperty把writable改为true
只读属性的实际用途
适合用于定义“初始化后不应变更”的配置项、常量别名或内部状态标识:
- 暴露一个只读的版本号:
Object.defineProperty(pkg, 'version', { value: '1.2.0', writable: false, enumerable: true }) - 防止意外覆盖构造函数原型上的方法引用(虽更常用
configurable: false) - 与
get/set访问器搭配时,writable不生效(访问器属性不使用writable,它仅用于数据属性)


















