Reflect API 提供更规范安全的原型操作方法:getPrototypeOf/setPrototypeOf/isExtensible/preventExtensions/ownKeys 均返回明确布尔值或数组,失败不抛异常;与 Proxy 协同时能准确复现原生行为。

Reflect API 提供了多个与对象原型操作直接对应的静态方法,能更规范、更安全地替代 Object 上的同类方法。它不抛异常、返回值语义清晰,尤其适合需要容错判断或配合 Proxy 的场景。
获取和设置原型链
用 Reflect.getPrototypeOf() 替代 Object.getPrototypeOf(),用 Reflect.setPrototypeOf() 替代 Object.setPrototypeOf()。
- Reflect.getPrototypeOf(target) 行为与 Object.getPrototypeOf 完全一致,但作为函数式调用更统一;
- Reflect.setPrototypeOf(target, prototype) 在失败时(如 target 不可扩展、prototype 非对象或 null)返回 false,而 Object.setPrototypeOf 会直接抛出 TypeError,需 try/catch 捕获。
控制对象可扩展性
用 Reflect.isExtensible() 和 Reflect.preventExtensions() 替代 Object.isExtensible() 和 Object.preventExtensions()。
- 两者返回值均为布尔值,语义明确:前者判读是否可添加新属性,后者尝试冻结扩展能力;
- Reflect.preventExtensions 在 target 已不可扩展时静默返回 false,Object 版本则抛错。
获取自身所有键名(含 Symbol)
用 Reflect.ownKeys(target) 替代 Object.getOwnPropertyNames(target) 与 Object.getOwnPropertySymbols(target) 的组合调用。
- Reflect.ownKeys 返回一个数组,包含 target 自身的所有属性键(字符串 + Symbol),顺序也符合规范;
- 它不受
enumerable属性影响,比Object.keys()更底层、更完整。
与 Proxy 协同保持原型行为一致性
在 Proxy handler 中操作原型时,应优先使用 Reflect 方法,确保默认行为不被意外绕过。
- 例如拦截
setPrototypeOf时,用Reflect.setPrototypeOf(target, proto)转发,能准确复现原生逻辑; - 若直接调用 Object.setPrototypeOf,则可能忽略某些边界条件(如不可扩展对象的静默失败处理)。


















