Object.preventExtensions仅禁止添加新属性,已有属性仍可读写、删除和配置;通过Object.isExtensible()检测,其限制强度弱于seal和freeze。

Object.preventExtensions 可以让一个对象“封顶”,即禁止后续代码给它添加新属性,但已有属性仍可读写、可配置、可删除(除非被其他方式进一步限制)。
基本用法:直接调用并传入目标对象
只需一行代码即可生效:
const obj = { a: 1 };
Object.preventExtensions(obj);
obj.b = 2; // 静默失败(非严格模式)或抛出 TypeError(严格模式)
console.log(obj.b); // undefined
注意:
- 非严格模式下,赋值无效但不报错;
- 严格模式下,obj.b = 2 会立即抛出 TypeError: Cannot add property b, object is not extensible。
如何检测一个对象是否已被禁止扩展
使用 Object.isExtensible() 判断:
-
Object.isExtensible(obj) === false表示已禁止扩展; - 该方法返回布尔值,安全可靠,推荐在关键操作前检查。
它和 seal / freeze 的区别在哪
三者都是“限制对象修改”的手段,但强度递增:
-
preventExtensions:只禁新增属性,已有属性照常操作; -
Object.seal(obj):在 preventExtensions 基础上,还把所有现有属性设为configurable: false(不能删、不能改描述符); -
Object.freeze(obj):在 seal 基础上,再把所有数据属性设为writable: false(值不可改)。
也就是说,preventExtensions 是最轻量的“防加字段”方案,适合只想锁定结构、不干涉已有行为的场景。
常见误区提醒
以下操作不受 preventExtensions 影响:
- 修改已有属性的值(
obj.a = 99✅); - 删除已有属性(
delete obj.a✅,除非属性本身是configurable: false); - 通过
Object.defineProperty修改已有属性的writable或value(✅),但不能设新属性的描述符(❌)。
另外,它只作用于**自身属性**,不影响原型链上的属性访问或继承行为。


















