Object.preventExtensions只禁止向对象添加新属性,不限制已有属性的读写、删除及遍历;调用后新增属性操作静默失败或抛错,可用Object.isExtensible检测。

Object.preventExtensions 可以让一个对象“封顶”,即禁止后续向该对象添加新的自身属性,但不影响已有属性的读写或删除。
核心效果:只禁新增,不限读写删
调用后,对象仍可:
- 修改已有属性的值(如
obj.name = "new") - 删除已有属性(如
delete obj.age) - 遍历、访问所有可枚举/不可枚举属性
但以下操作会静默失败(非严格模式)或抛出 TypeError(严格模式):
obj.newProp = 123-
Object.defineProperty(obj, 'x', { value: 1 })(除非是修改已有属性) Reflect.defineProperty(obj, 'y', { value: 2 })
基本用法示例
直接传入目标对象即可:
const person = { name: 'Alice', age: 30 };
Object.preventExtensions(person);
person.city = 'Beijing'; // 静默失败(非严格模式)或报错(严格模式)
console.log(person.city); // undefined
console.log(Object.isExtensible(person)); // false注意:它不冻结、不密封
与 Object.seal 和 Object.freeze 不同:
-
preventExtensions:只拦新增,不限改、不限删 -
seal:在 preventExtensions 基础上,还禁止删除和configurable: false -
freeze:在 seal 基础上,还把所有数据属性设为writable: false
也就是说,preventExtensions 是三者中限制最轻的,适合只需“止增”场景,比如配置对象初始化后不再允许扩展字段。
检查是否已禁止扩展
用 Object.isExtensible(obj) 判断:
console.log(Object.isExtensible({})); // true
const obj = {};
Object.preventExtensions(obj);
console.log(Object.isExtensible(obj)); // false该方法返回布尔值,安全可靠,常用于调试或条件逻辑中。










