Object.preventExtensions 能禁止对象添加新属性但允许修改已有属性,调用后返回原对象且不可逆;对非对象类型调用会报错;可用 Object.isExtensible 判断,返回 false 表示已阻止扩展。

Object.preventExtensions 能让对象“封顶”——禁止添加新属性,但已存在的属性仍可读、写、配置(比如改值、删属性、改描述符),只要没被 Object.seal 或 Object.freeze 进一步限制。
基本用法:调用即生效
只需传入目标对象,方法会原地修改该对象,并返回它本身(方便链式调用):
-
Object.preventExtensions(obj)立即生效,不可逆 - 对
null或原始值(如字符串、数字)调用会报错,只接受对象 - 返回值就是原对象,不是副本
验证是否已阻止扩展
用 Object.isExtensible(obj) 判断:
- 返回
true表示还能加属性 - 返回
false表示已被preventExtensions(或更严格的 seal/freeze)限制
例如:const obj = { a: 1 };<br>Object.preventExtensions(obj);<br>console.log(Object.isExtensible(obj)); // false
允许的操作 vs 不允许的操作
✅ 允许(旧属性照常使用):
- 修改已有属性的值:
obj.a = 2 - 删除已有属性:
delete obj.a - 重定义已有属性(如改
writable、configurable):Object.defineProperty(obj, 'a', { writable: false })
❌ 不允许(扩展行为被拦截):
- 添加新属性:
obj.b = 3(非严格模式静默失败,严格模式报TypeError) - 用
Object.defineProperty添加新属性:Object.defineProperty(obj, 'c', { value: 4 })(同样报错) - 通过解构赋值或扩展运算符新增属性也会失败(本质仍是添加新键)
注意:不影响原型链
preventExtensions 只作用于**自身属性**。如果对象有原型,访问原型上的属性不受影响,也不会阻止给原型添加新属性。若需彻底锁定,需分别处理原型或改用 seal/freeze。

















