Object.preventExtensions 用于阻止对象添加新属性,但允许修改或删除已有属性,且不递归作用于嵌套对象;调用后新增自有属性在严格模式下抛错、非严格模式静默失败,不可逆,可用 Object.isExtensible 检查状态。

Object.preventExtensions 用于阻止对象添加新属性,但允许修改或删除已有属性。它只影响对象自身,不递归作用于嵌套对象。
基本用法和效果
调用 Object.preventExtensions(obj) 后,该对象不能再新增自有属性(包括通过赋值或 Object.defineProperty)。但已有属性仍可读写、配置、删除;原型链也不受影响。
- 对普通对象生效:一旦被锁定,
obj.newProp = 1在严格模式下抛错,非严格模式静默失败 - 不影响继承属性:对象仍能访问原型上的属性,也能在原型上添加新属性(只要原型未被限制)
- 不可逆:没有对应方法解除限制,只能创建新对象替代
判断对象是否已被禁止扩展
用 Object.isExtensible(obj) 检查状态,返回布尔值:
const obj = { a: 1 };
console.log(Object.isExtensible(obj)); // true
Object.preventExtensions(obj);
console.log(Object.isExtensible(obj)); // false
与 Object.seal 和 Object.freeze 的区别
三者都是限制对象变更的 API,但强度递增:
立即学习“Java免费学习笔记(深入)”;
- preventExtensions:只禁新增属性,已有属性完全自由
-
seal:在 preventExtensions 基础上,把所有自有属性设为
configurable: false(不能删、不能改描述符) -
freeze:在 seal 基础上,把所有自有数据属性设为
writable: false(值不可改)
注意:它们都不深冻结——嵌套对象需单独处理。
实际使用建议
适合在对象初始化后、对外暴露前“定型”,防止意外添加字段:
- 构造函数末尾调用,确保实例结构稳定
- 配置对象、常量对象定义完成后立即锁定
- 配合 TypeScript 使用时,可作为运行时补充校验(TS 只做编译期检查)
不推荐在频繁修改的场景使用,也不应替代权限控制逻辑。


















