真正安全的只读配置必须同时设置 writable: false 且 configurable: false;前者禁止赋值,后者禁止修改描述符、删除属性或转为访问器属性。

在 JavaScript 中,writable 和 configurable 是对象属性描述符(property descriptor)的两个关键布尔属性,它们共同决定了一个属性是否可修改、可删除、可重新配置。要实现“只读配置”,核心是将 writable: false(禁止赋值)并通常配合 configurable: false(禁止改描述符或删除),从而形成真正稳固的只读行为。
只读属性:writable 设为 false
当一个属性的 writable 为 false 时,直接赋值会被静默忽略(非严格模式)或抛出 TypeError(严格模式)。这是实现“不可写”的最直接方式。
示例:
const obj = {};
Object.defineProperty(obj, 'API_URL', {
value: 'https://api.example.com',
writable: false,
enumerable: true,
configurable: false
});
obj.API_URL = 'https://hacked.com'; // 无效(非严格)或报错(严格)
console.log(obj.API_URL); // 'https://api.example.com'
防篡改加固:configurable 设为 false
仅设 writable: false 并不足够——如果 configurable 仍为 true,开发者仍可通过 Object.defineProperty 再次修改描述符(比如把 writable 改回 true),从而绕过只读限制。
因此,**真正安全的只读配置必须同时设置:writable: false 且 configurable: false**。
-
configurable: false后,无法删除该属性(delete obj.prop失败) - 无法再次调用
Object.defineProperty修改writable、enumerable或configurable - 也无法将其转为 accessor 属性(反之亦然)
实用技巧:批量定义只读配置对象
若需定义多个只读配置项(如常量集合),可用 Object.defineProperties 批量处理,避免重复写描述符:
const CONFIG = {};
Object.defineProperties(CONFIG, {
TIMEOUT: { value: 5000, writable: false, configurable: false },
ENV: { value: 'production', writable: false, configurable: false },
VERSION: { value: '2.1.0', writable: false, configurable: false }
});
这样既简洁,又确保每个字段都不可写、不可重配置。
注意:value 与 writable 需配合使用
若属性是 value 类型(即数据属性),则 writable 才有意义;若误设为 get/set(访问器属性),writable 会被忽略(访问器属性本身无 writable 概念)。
正确做法:
- 只读常量 → 用
value + writable: false + configurable: false - 需要逻辑校验的“伪只读” → 可用
get+ 空set(但set仍可被覆盖,安全性不如configurable: false)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











