writable控制属性值能否被直接赋值修改,但其效果受配置方式、严格模式和configurable状态共同制约;默认true,设为false后非严格模式静默失败,严格模式抛typeerror,且不可逆除非configurable为true。

writable 控制属性值能否被直接赋值修改,但它不是“只读开关”那么简单——它的效果受配置方式、严格模式、configurable 状态共同制约。
必须用 defineProperty 显式设置
对象字面量或构造函数中创建的属性,默认 writable: true,且无法通过点号或方括号语法反向添加描述符。想启用写保护,只能用:
Object.defineProperty(obj, 'prop', { value: 1, writable: false })- 或批量设置:
Object.defineProperties(obj, { prop: { value: 1, writable: false } })
直接写 obj.prop = { writable: false } 完全无效——那只是给属性赋了个新对象值,和描述符无关。
设为 false 后,赋值行为分两种情况
非严格模式下,obj.prop = 2 静默失败,原值不变,也不报错;
严格模式下(如函数顶部有 "use strict"),同一操作会立即抛出 TypeError。
用于 inference.sh 的 JavaScript/TypeScript SDK,可运行 AI 应用、构建代理、集成 150+ 模型。包名:@inferencesh/sdk(npm install),完整 TypeScript 支持。
注意:这和 const 不同——const obj = { x: 1 } 允许改 obj.x,因为 const 锁的是变量绑定,不是属性本身。
不可逆,除非 configurable 为 true
一旦 writable: false 生效,就再也不能用 defineProperty 把它改回 true:
- 如果当时设置了
configurable: true,还能删掉重定义整个描述符(包括把writable改回来) - 如果
configurable: false(默认冻结后就是如此),那就彻底锁死:不能改值、不能改描述符、也不能删属性
所以,若需未来调整权限,务必在初始定义时保留 configurable: true。
它只管“赋值”,不管其他操作
writable: false 不影响:
- 属性是否可枚举(由
enumerable控制) - 属性是否可删除(由
configurable控制) - 能否通过 getter/setter 间接修改(存取描述符不看
writable)
比如一个属性同时有 get 和 set,writable 字段根本不能出现——两者互斥。










