object.preventextensions 禁止向对象添加新属性但允许修改或删除已有属性,不影响原型链,且不可逆;可用 object.isextensible() 检测,区别于 seal 和 freeze。

Object.preventExtensions 用于禁止向对象添加新属性,但允许修改或删除已有属性。它只影响对象自身的可扩展性,不影响原型链上的属性操作。
基本用法和效果
调用后,对象进入“不可扩展”状态:
- 无法通过赋值(
obj.newProp = value)、Object.defineProperty或解构赋值等方式新增自有属性; - 已有属性仍可读写、可配置(除非单独设为
configurable: false); - 原型链不受影响——仍可访问和继承原型上的属性;
- 该操作不可逆,也无法通过任何方式恢复扩展能力。
如何检测对象是否被禁止扩展
使用 Object.isExtensible() 判断:
你接手一个需求时,是不是经常这样:"改一个小字段 → 结果把不相关的代码也改了"、"需求说得很模糊 → 做着做着发现跑偏了"、"数据库加个字段 → 上线才发现漏了数据兼容"、"做了个新功能 → 一个月后自己都忘了当时怎么设计的"、"写到一半被中断 → 再回来不知道从哪继续";这个 Skill 就是专门解决这些问题的。 它会自动探测你的项目环境(JDK、Spring Boot、ORM、数据库、前端框架),记在
const obj = { a: 1 };
console.log(Object.isExtensible(obj)); // true
Object.preventExtensions(obj);
console.log(Object.isExtensible(obj)); // false
常见误区与注意事项
注意它和 Object.seal、Object.freeze 的区别:
-
preventExtensions:只禁新增,不限制改/删; -
seal:在preventExtensions基础上,把所有自有属性设为configurable: false(即不能删、不能改描述符); -
freeze:在seal基础上,把所有数据属性设为writable: false(即不能改值)。
另外,对数组调用 preventExtensions 后,仍可通过 push、pop 等方法改变长度和元素——因为这些方法不新增“属性”,而是修改已有索引和 length 属性(前提是它们本身是可写的)。
实际使用建议
适合在对象结构确定后、需要防止误加字段的场景,比如配置对象、常量容器或 API 返回的只读结构体:
- 在构造函数末尾或初始化完成后立即调用;
- 搭配
Object.defineProperty使用,可精细控制每个属性的行为; - 开发阶段可配合
console.assert(Object.isExtensible(obj), 'obj 不应被扩展')做运行时校验。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










