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),是防篡改的关键一环。
你接手一个需求时,是不是经常这样:"改一个小字段 → 结果把不相关的代码也改了"、"需求说得很模糊 → 做着做着发现跑偏了"、"数据库加个字段 → 上线才发现漏了数据兼容"、"做了个新功能 → 一个月后自己都忘了当时怎么设计的"、"写到一半被中断 → 再回来不知道从哪继续";这个 Skill 就是专门解决这些问题的。 它会自动探测你的项目环境(JDK、Spring Boot、ORM、数据库、前端框架),记在
- 一旦
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)也可配合描述符实现逻辑拦截,但需自行控制内部状态,不是自动防改
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










