Object.preventExtensions仅阻止对象添加新属性,已有属性仍可读写、删除及修改描述符,且只作用于自身属性不递归嵌套对象。

Object.preventExtensions 用于阻止对象被添加新属性,但已存在的属性仍可读写、可删除,也能修改属性描述符(如 writable、configurable)。
基本用法:调用后无法新增属性
直接传入目标对象即可生效:
- 后续对对象添加新属性的操作(点号、方括号、解构赋值等)在严格模式下会抛出 TypeError;非严格模式下静默失败(不报错,但属性不会被添加)。
- 只影响“自身属性”,不影响原型链上的属性访问或继承。
Object.preventExtensions(obj);
obj.b = 2; // 非严格模式:无效;严格模式:TypeError
obj.a = 3; // ✅ 允许修改已有属性值
delete obj.a; // ✅ 允许删除已有属性
Object.defineProperty(obj, 'c', { value: 4 }); // ❌ TypeError(试图添加新属性)
如何检测对象是否已被禁止扩展
使用 Object.isExtensible 判断:
- 返回
false表示对象已不可扩展; - 该方法不会受原型影响,只检查对象自身状态。
与其他冻结方法的区别
它比 Object.seal 和 Object.freeze 更轻量:
立即学习“Java免费学习笔记(深入)”;
-
preventExtensions:只禁新增,不限制改值、删属性、改描述符; -
seal:在 preventExtensions 基础上,还把所有自有属性设为configurable: false(不能删、不能改描述符); -
freeze:在 seal 基础上,再把所有数据属性设为writable: false(不能改值)。
注意深浅限制
该方法是浅锁定 —— 只作用于目标对象本身,不递归处理嵌套对象:
- 如果属性值是另一个对象,那个对象仍可自由扩展;
- 如需完全冻结深层结构,需手动递归调用或配合
Object.freeze使用。
Object.preventExtensions(obj);
obj.nested.y = 2; // ✅ 成功,因为 nested 本身未被锁定


















