Object.preventExtensions仅阻止对象新增属性,允许修改值、删除属性及访问原型链;返回原对象,可用Object.isExtensible检测;与seal、freeze呈递进关系,但不递归作用于嵌套对象。

Object.preventExtensions 用于阻止对象新增属性,但允许修改现有属性值、删除属性,也不影响原型链。它只锁定“结构”——即属性名的增减,不冻结值或可配置性。
基本用法:让对象不可扩展
调用 Object.preventExtensions(obj) 后,再尝试添加新属性会静默失败(非严格模式)或抛出 TypeError(严格模式):
- 对普通对象直接生效:
const obj = { a: 1 }; Object.preventExtensions(obj); obj.b = 2; // 静默忽略(非严格)或报错(严格) - 返回值是原对象本身,不是新对象,所以可链式调用其他方法(如
Object.seal或Object.freeze) - 检测是否被锁定:用
Object.isExtensible(obj),返回false表示已禁止扩展
和 seal / freeze 的区别要分清
三者层级递进,但作用不同:
Java Maven 项目审查工作流的通用输入处理。当 Java Maven 项目以 ZIP压缩包或 GitLab 仓库 URL 形式提供且需要...时使用。
-
preventExtensions:只禁新增属性,delete和改值仍允许 -
Object.seal:在 preventExtensions 基础上,还把所有现有属性设为configurable: false,即不能删、不能改描述符(如 writable),但值仍可改 -
Object.freeze:在 seal 基础上,再把所有数据属性设为writable: false,彻底只读(浅层)
注意:只影响自身,不递归
该方法只作用于目标对象本身,对其嵌套的子对象完全无约束:
立即学习“Java免费学习笔记(深入)”;
const obj = { nested: { x: 1 } }; Object.preventExtensions(obj); obj.nested.y = 2; // ✅ 允许,因为 nested 本身没被锁定- 如需深层锁定,需手动遍历或配合
Object.freeze递归处理(注意循环引用风险) - 数组也是对象,
preventExtensions可阻止arr.newProp = ...,但不影响push、length赋值等改变长度的操作(因这些不新增“自有属性”,而是修改已有属性)
适用场景和建议
适合在对象定义完成、进入稳定阶段时使用,比如配置对象、常量容器、API 返回的结构化数据:
- 在构造函数末尾或初始化函数结尾调用,防止后续误加字段
- 搭配 TypeScript 使用时,虽类型已限定,但运行时加属性仍可能绕过类型检查,preventExtensions 提供额外防护
- 不要在需要动态扩展的场景(如缓存对象、事件监听器集合)中使用,否则逻辑会意外失效

















