Reflect本身不密封或限制对象扩展,仅提供与Object方法功能对齐的统一接口;真正执行密封的是Object.seal()、禁止扩展的是Object.preventExtensions(),而Reflect.seal()和Reflect.preventExtensions()是其返回布尔值的镜像封装。

Reflect 本身不能密封或限制对象扩展,它只是提供了一组与 Object 静态方法功能对齐的、更统一的操作接口。真正执行“密封”和“禁止扩展”的是 Object.seal() 和 Object.preventExtensions() —— 而 Reflect.seal() 和 Reflect.preventExtensions() 只是它们的镜像(mirror)封装,行为完全一致,但返回值更规范(统一返回布尔值)。
Reflect.seal():密封对象(不可增删属性,已有属性可改值但不可重配置)
调用 Reflect.seal(target) 等价于 Object.seal(target),会对目标对象做两件事:
- 自动调用
Object.preventExtensions(target),禁止新增属性; - 将对象所有自身属性的
configurable设为false,即无法删除属性、无法修改属性描述符(如writable、enumerable、configurable)。
注意:已存在的数据属性(writable: true)仍可修改值;访问器属性的 get/set 也可照常调用,只是不能再重新定义。
Reflect.preventExtensions():仅禁止扩展(允许改值、删属性、重配置)
Reflect.preventExtensions(target) 只阻止添加新属性,不改动现有属性的描述符。这意味着:
立即学习“Java免费学习笔记(深入)”;
- 不能通过点号、方括号或
Object.defineProperty添加新属性; - 已有属性仍可赋新值(如果
writable: true); - 仍可
delete属性(只要configurable: true); - 仍可用
Object.defineProperty修改已有属性的writable或value(前提是configurable: true)。
和 Object 方法的关键区别:返回值与失败处理
Reflect 方法在设计上更偏向“操作是否成功”,因此:
- 成功时返回
true,失败(如传入非对象)返回false; - 而
Object.seal()/Object.preventExtensions()在非法输入时抛出TypeError; - 这使得
Reflect更适合在需要容错或条件判断的场景中使用,比如代理(Proxy)陷阱里统一返回布尔结果。
实际使用建议
如果你只是想密封一个对象,直接用 Reflect.seal(obj) 即可,语义清晰且安全:
Reflect.seal(obj); // true
obj.b = 2; // 无效(静默失败,严格模式下报错)
delete obj.a; // false(删除失败)
Object.defineProperty(obj, 'a', { value: 99 }); // 报错:Cannot redefine property


















