object.preventextensions()禁止对象添加新属性但允许读写删已有属性,不可逆且不深处理;与seal、freeze相比约束最弱,适用于防误加字段场景。

用 Object.preventExtensions() 可以禁止向对象动态添加新属性。
Object.preventExtensions() 的作用和特点
该方法让对象进入“不可扩展”状态,核心效果是:不能再添加新的自有属性,但已有属性仍可读、可写、可删除,原型链上的属性访问也不受影响。
- 调用后,任何尝试添加新属性(如
obj.newProp = value或Object.defineProperty(obj, 'newProp', {...}))都会失败:非严格模式下静默忽略,严格模式下抛出TypeError -
Object.isExtensible(obj)返回false,可用来检测对象是否已被禁止扩展 - 操作不可逆——一旦禁止扩展,无法恢复为可扩展状态
- 它不深处理,嵌套对象仍可自由添加属性,如需完全冻结需递归调用或借助
Object.freeze()
和 seal、freeze 的关键区别
三者都是限制对象修改的工具,但约束强度不同:
- preventExtensions:只禁新增,不限改值、不限删属性
-
seal:在 preventExtensions 基础上,把所有自有属性设为
configurable: false→ 禁新增、禁删、禁重配置(比如不能再用defineProperty改writable),但还能改值 -
freeze:在 seal 基础上,再把所有自有数据属性设为
writable: false→ 彻底只读(禁新增、禁删、禁改值)
实际使用建议
适合用于结构已确定、仅需防误加字段的场景:
- 模块导出前对配置对象做保护,例如:
const config = { timeout: 5000 }; Object.preventExtensions(config); export { config }; - 构造函数或工厂函数返回对象前调用,防止外部意外扩展实例
- 配合
Object.defineProperty()使用,可先禁止扩展,再精细定义各属性的enumerable、writable、configurable行为
注意常见误区
它不是“只读”,也不是“私有化”:
- 不能阻止修改已有属性的值(
obj.existing = 'new'依然有效) - 不能阻止删除已有属性(
delete obj.existing仍可成功) - 不影响原型上定义的属性,子对象仍可通过原型继承并访问属性
- 不会影响数组长度或索引赋值(
arr[10] = 'x'在数组上仍可能生效,因数组本身未被禁止扩展)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











