reflect.preventextensions 用于阻止对象新增属性,功能等同 object.preventextensions,返回布尔值,仅禁新增属性而不影响已有属性的读写删,不递归作用于嵌套对象。

Reflect.preventExtensions 是 JavaScript 中用于阻止对象新增属性的方法,它和 Object.preventExtensions 功能完全一致,只是作为 Reflect API 的一部分,更符合“操作即反射”的设计哲学。
作用:禁止添加新属性
调用后,对象将无法添加新的自身属性(包括使用点号、方括号或 Object.defineProperty),但已有属性仍可读写、可配置、可删除(除非另有保护)。
- 对普通对象、数组、Date 等内置对象都有效
- 对不可扩展对象再次调用不会报错,而是静默返回
true - 只影响对象本身,不递归作用于嵌套对象
基本用法示例
直接传入目标对象即可:
const obj = { a: 1 };
Reflect.preventExtensions(obj); // true
obj.b = 2; // 严格模式下报 TypeError,非严格模式静默失败
console.log(obj.b); // undefined
与 Object.preventExtensions 的区别
两者行为完全相同,但调用方式和语义略有不同:
-
Object.preventExtensions(obj)是传统静态方法 -
Reflect.preventExtensions(obj)返回布尔值(true表示成功,false表示失败),更适合配合条件判断或 Proxy 拦截 - 在 Proxy 的
preventExtensions拦截器中,必须返回Reflect.preventExtensions(target)或明确的布尔值
注意事项
防止扩展 ≠ 冻结 ≠ 密封,三者层级不同:
-
preventExtensions:仅禁新增属性 -
Object.seal:禁新增 + 禁删除 + 所有属性变为不可配置(但仍可修改值) -
Object.freeze:在密封基础上,所有数据属性变为只读
如果需要更强保护,需组合使用或直接选用 seal/freeze。










