JavaScript通过属性描述符(writable、configurable、enumerable)实现细粒度防篡改,核心是Object.defineProperty显式设置;writable=false阻止赋值,configurable=false锁定属性结构,freeze/seal/preventExtensions为批量防护方案。

JavaScript 中可以通过属性描述符(Property Descriptor)控制对象属性的可写性、可配置性和可枚举性,从而实现细粒度的防篡改保护。核心在于使用 Object.defineProperty 或 Object.defineProperties 显式设置描述符,而非依赖默认行为。
冻结关键属性:writable = false
将 writable 设为 false 可阻止属性值被重新赋值,适用于常量或初始化后不应变更的字段。
例如:
const obj = {};Object.defineProperty(obj, 'API_VERSION', {
value: 'v2.1',
writable: false,
enumerable: true,
configurable: false
});
obj.API_VERSION = 'v3.0'; // 无效(非严格模式下静默失败;严格模式报 TypeError)
锁定结构:configurable = false
设为 false 后,该属性无法被删除,也不能再次修改其描述符(如不能把 writable: false 改回 true),是防篡改的关键一环。
Java Maven 项目审查工作流的通用输入处理。当 Java Maven 项目以 ZIP压缩包或 GitLab 仓库 URL 形式提供且需要...时使用。
立即学习“Java免费学习笔记(深入)”;
- 一旦
configurable: false,后续调用Object.defineProperty修改同一属性会抛错(除非只改writable从true到false) - 配合
writable: false使用,能真正“钉住”属性值和元信息 - 注意:
configurable: false不影响属性值内部的可变性(如对象属性仍可增删其子属性)
批量保护与深层冻结策略
单个属性保护适合关键字段;若需整体防护,可结合描述符与内置方法:
-
Object.preventExtensions(obj):禁止新增属性 -
Object.seal(obj):等价于preventExtensions + configurable: false所有现有属性 -
Object.freeze(obj):在seal基础上,对所有数据属性设writable: false
这些方法底层正是遍历属性并设置对应描述符。如需自定义冻结逻辑(比如只冻结部分属性、保留某些可写),应手动遍历并调用 defineProperty 设置描述符。
不可靠的表面防护需警惕
仅设 enumerable: false 或仅用 const 声明对象,都不能防篡改:
-
const obj = {...}只防止obj变量重新赋值,不保护其属性 -
enumerable: false仅影响for...in和Object.keys(),不影响读写 - 访问器属性(
get/set)也可配合描述符实现逻辑拦截,但需自行控制内部状态,不是自动防改

















