writable: false 是 javascript 中强制执行的属性写保护机制,仅拦截赋值动作而不影响读取、枚举或删除;需通过 object.defineproperty 显式设置,配合 configurable: true 可后续修改,比 object.freeze 更轻量灵活。

用 writable: false 可以让对象属性“只读”,不是靠约定或注释,而是由 JavaScript 引擎强制执行的写保护机制。它不阻止读取、不隐藏属性,只拦截赋值动作——这是防止意外或恶意覆盖最轻量也最精准的方式。
只对特定属性启用写保护
不必冻结整个对象,只需锁定关键字段。比如配置项、版本号、初始状态标识等,一旦设定就不该被改写:
- 用
Object.defineProperty()显式定义属性,并设writable: false - 注意:对象字面量中声明的属性无法直接设置
writable,必须通过 API 添加 - 示例:
Object.defineProperty(config, 'API_URL', { value: 'https://api.example.com', writable: false, enumerable: true });
理解静默失败与严格模式的区别
赋值是否报错,取决于当前执行环境:
- 非严格模式下:
obj.prop = newValue不会报错,但也不生效,原值保持不变 - 严格模式下(顶部加
"use strict"):同样赋值会立即抛出TypeError,便于开发阶段快速暴露问题 - 无论哪种模式,
console.log(obj.prop)都能正常读到原始值
配合 configurable 实现可维护性
writable: false 锁定后默认不可逆,但如果后续需要开放修改权限,定义时就得预留余地:
- 添加属性时显式指定
configurable: true,否则之后无法再把writable改回true - 例如:
Object.defineProperty(obj, 'token', { value: 'abc', writable: false, configurable: true }); - 之后可通过再次调用
defineProperty将writable设为true(仅限此一种修改)
避免和防篡改方法混淆
writable 是细粒度控制,不同于 Object.freeze() 等整对象操作:
-
freeze会让所有自有属性writable: false且configurable: false,不可逆且影响全部属性 -
writable: false只作用于单个属性,不影响删除、枚举、新增其他属性 - 若只需保护几个关键字段,用描述符比冻结更灵活、副作用更小
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











