Object.preventExtensions()使对象不可扩展,禁止添加新属性但允许修改和删除已有属性、访问原型属性,且不可逆;与seal、freeze相比约束最弱。

Object.preventExtensions() 能让对象“封口”,即禁止添加新属性,但允许修改已有属性的值、删除已有属性,也不影响原型链上的属性访问。
基本用法和效果
调用该方法后,对象进入“不可扩展”状态。之后任何尝试添加新自有属性的操作都会静默失败(非严格模式)或抛出 TypeError(严格模式)。
- 不影响已有属性的读写、删除(
delete) - 不影响原型上定义的属性(仍可继承并访问)
- 不可逆:一旦防止扩展,无法恢复为可扩展状态
简单示例
看一段代码直观理解:
const obj = { a: 1 };
Object.preventExtensions(obj);
obj.b = 2; // 静默失败(非严格模式)/ 报错(严格模式)
console.log(obj.b); // undefined
console.log(Object.isExtensible(obj)); // false
obj.a = 99; // ✅ 允许修改已有属性
delete obj.a; // ✅ 允许删除已有属性
和 Object.seal()、Object.freeze() 的区别
三者都是对象限制方法,但约束强度递增:
- preventExtensions:只禁新增,不限改、不限删
-
seal:在 preventExtensions 基础上,还把所有自有属性设为
configurable: false→ 禁新增、禁删、禁重配置(如改writable或删属性),但依然可改值 -
freeze:在 seal 基础上,再把所有自有数据属性设为
writable: false→ 禁新增、禁删、禁改值(彻底只读)
实际使用建议
适合用于明确“结构已定型”的场景,比如配置对象初始化后、模块导出前的保护:
- 在构造函数末尾或工厂函数返回前调用,确保使用者不会意外加字段
- 配合
Object.defineProperty使用,可精细控制各属性行为 - 注意:它不深冻结,嵌套对象仍可扩展,需手动递归处理(或用第三方库如
deep-freeze)

















