reflect 不直接操作原型链方法,而是提供标准化反射接口;调用原型方法需先获取(如 object.getprototypeof(obj)[m]),再用 reflect.apply(method, obj, args) 绑定 this 安全执行。

Reflect 本身不直接“操作原型链上的方法”,它提供的是对 JavaScript 内部操作的标准化反射接口,比如读取、调用、设置属性或方法。要调用原型链上的方法(如 toString、hasOwnProperty 或自定义原型方法),关键在于:先获取该方法(可能来自原型),再用 Reflect.apply 或普通函数调用执行它,并正确绑定 this。
获取原型上的方法并调用
不能直接用 Reflect.get 拿到原型方法后就执行——因为获取到的是未绑定的函数,this 会丢失。必须显式绑定目标对象:
- 用
Object.getPrototypeOf(obj)[methodName]或obj.__proto__[methodName]获取原型方法(不推荐用__proto__) - 用
Reflect.apply(method, obj, args)安全调用,确保this指向obj
例如:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
const obj = { a: 1 };
const toString = Object.getPrototypeOf(obj).toString;
console.log(Reflect.apply(toString, obj, [])); // "[object Object]"
用 Reflect.get + Function.prototype.call 搭配更直观
Reflect.get 可以安全读取属性(包括继承来的),但返回的是函数本身,需手动绑定 this:
-
Reflect.get(obj, 'toString')会从原型链找到toString并返回 - 再用
.call(obj)或Reflect.apply(...)执行
注意:如果对象自身有同名属性,Reflect.get 会优先返回自身的,不是原型上的 —— 这符合属性访问规则。
检查方法是否存在于原型链上(非调用)
Reflect.has 只检查**自有属性**(不查原型),所以不能用于判断原型方法是否存在。正确方式是:
- 用
Object.prototype.hasOwnProperty.call(Object.getPrototypeOf(obj), 'methodName')判断是否在直接原型上 - 或用
obj.constructor.prototype.hasOwnProperty('methodName')(需确保 constructor 未被篡改) - 若要完整遍历原型链,需手动循环
Object.getPrototypeOf()
避免常见误区
-
Reflect.apply不负责查找方法,只负责调用;查找仍靠 JS 原有机制(原型链) -
Reflect.get(obj, 'method')返回的是已绑定或未绑定的函数,取决于属性描述符中的value或get,不是自动绑定this - 不要试图用
Reflect.setPrototypeOf来“操作方法”——它只改[[Prototype]],不修改方法行为
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










