object.preventextensions仅禁止添加新属性,允许读写删改已有属性;在非严格模式下静默失败,严格模式下抛typeerror;其本质是将[[extensible]]设为false,不可逆。

Object.preventExtensions 的核心逻辑是“封顶不封底”:它只禁止向对象添加新属性,对已有属性的读、写、删除、重配置(只要可配置)全部放行。
它到底禁止什么操作
调用后,以下新增行为全部失效:
- 点号赋值:
obj.newProp = 1 - 方括号赋值:
obj['newProp'] = 1 - 通过
Object.defineProperty添加新属性:Object.defineProperty(obj, 'newProp', {...})
这些操作在非严格模式下静默失败(赋值无效,无提示);在严格模式下直接抛出 TypeError。
你接手一个需求时,是不是经常这样:"改一个小字段 → 结果把不相关的代码也改了"、"需求说得很模糊 → 做着做着发现跑偏了"、"数据库加个字段 → 上线才发现漏了数据兼容"、"做了个新功能 → 一个月后自己都忘了当时怎么设计的"、"写到一半被中断 → 再回来不知道从哪继续";这个 Skill 就是专门解决这些问题的。 它会自动探测你的项目环境(JDK、Spring Boot、ORM、数据库、前端框架),记在
它完全不限制哪些行为
已有属性依然自由可控:
- 修改值:
obj.existing = 'updated' - 删除属性:
delete obj.existing - 重定义描述符(前提是
configurable: true):Object.defineProperty(obj, 'existing', { writable: false }) - 枚举、in 检查、
Object.keys()等行为不受影响
关键机制:内部槽 [[Extensible]]
该方法本质是将对象的内部属性 [[Extensible]] 设为 false。这个状态仅控制“能否加新属性”,不改变任何已有属性的 writable、configurable 或 enumerable 特性。它也不影响原型链——你仍可给原型添加属性,子对象继承关系照常工作。
检测与不可逆性
用 Object.isExtensible(obj) 判断最准确,返回 false 即表示已被禁止扩展。这个操作不可撤销,也不能恢复为可扩展状态。即使多次调用 preventExtensions,效果也等同于一次。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










