2023-05-12 08:21:13
在 JavaScript 中,使用 Reflect 操作对象原型的核心方法是 Reflect.getPrototypeOf() 和 Reflect.setPrototypeOf(),它们提供了比传统 Object 方法更一致、健壮的 API,尤其适用于元编程、Proxy 拦截或底层工具开发。以下是具体用法和注意事项:
1. 获取对象原型:Reflect.getPrototypeOf(target)target:需为对象(否则返回 false)。
prototype:需为对象或 null(否则返回 false)。
Object.setPrototypeOf() 失败时抛出 TypeError,需用 try...catch。
Reflect.setPrototypeOf() 返回布尔值,适合条件判断。
Reflect 方法名直接映射语言内部操作(如 Reflect.apply 对应函数调用),便于理解。
避免直接使用 __proto__(非标准、性能差),Reflect 提供统一方案。
元编程与 Proxy:在 Proxy 陷阱中拦截原型操作时,需配合 Reflect 保持默认行为。const proxy = new Proxy({}, { setPrototypeOf(target, proto) { console.log("Setting prototype!"); return Reflect.setPrototypeOf(target, proto); }});
优雅处理失败:需静默处理原型设置失败时(如不可扩展对象)。
底层工具库:编写通用原型操作工具时,Reflect 更健壮。
常规继承:优先用 class 或 Object.create() 明确继承关系。const child = Object.create(parentProto); // 优于后续修改原型
频繁修改原型:运行时修改原型会破坏引擎优化,导致性能下降。
仅需获取原型:Object.getPrototypeOf() 与 Reflect.getPrototypeOf() 性能相近,按风格选择。
创建时指定原型:Object.create(proto)。
组合优于继承:通过属性嵌入功能模块。
使用 class:明确继承关系,避免运行时修改。
