writable为false时,直接赋值在非严格模式下静默失败、值不变,严格模式下抛TypeError;仅拦截=赋值,不阻止Object.defineProperty修改;原型链上writable:false会阻止子对象同名属性赋值。

当 JavaScript 对象属性的 writable 描述符设为 false 时,直接赋值(obj.prop = newValue)不会报错(非严格模式),也不会生效——它会静默失败。这种“看似执行了、实则没变化”的行为,就是它的核心隐式行为。
非严格模式下:赋值不报错,但值不变
这是最易被忽略的陷阱。代码运行无异常,开发者却误以为赋值成功:
const obj = {}; Object.defineProperty(obj, 'x', { value: 1, writable: false });-
obj.x = 99;—— 执行后obj.x仍是1,控制台不提示、不中断 - 若后续逻辑依赖
obj.x已更新,就会产生难以追踪的逻辑错误
严格模式下:直接抛出 TypeError
启用严格模式(如脚本顶部加 "use strict")会让问题暴露得更早:
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
-
obj.x = 99;立即触发TypeError: Cannot assign to read only property 'x' - 错误堆栈明确指向赋值语句,便于定位和修复
- 适合开发与测试阶段开启,避免静默失效流入生产环境
该限制只作用于直接赋值,不阻断其他修改方式
writable: false 不是“锁死属性”,它仅拦截 = 赋值操作:
立即学习“Java免费学习笔记(深入)”;
- 仍可通过
Object.defineProperty(obj, 'x', { value: 200 })修改值——但前提是configurable: true - 若同时设置了
configurable: false,则writable永久锁定,无法再改回true - 访问器属性(
get/set)不受writable影响;若定义了set,赋值会触发该函数而非受writable控制
原型链上的 writable: false 会影响子对象赋值
当通过 = 给子对象添加新属性时,若原型链上存在同名且 writable: false 的数据属性,赋值将完全失效:
const proto = {}; Object.defineProperty(proto, 'flag', { value: 'on', writable: false });const child = Object.create(proto); child.flag = 'off';- 结果:
child自身无flag,child.flag读取的仍是proto.flag('on'),且未新增任何属性 - 这不同于
writable: true的情况(此时会在child上创建屏蔽属性)

















