Object.getPrototypeOf()是获取对象隐式原型的标准方法,返回其内部[[Prototype]]指向的对象,可配合循环遍历完整原型链,替代非标准的__proto__。

Reflector 不是 JavaScript 的标准机制,也没有名为 Reflector 的内置 API 或规范接口。你提到的“Reflector 机制”很可能存在概念混淆——JS 中没有 Reflector 类或全局 Reflector 对象用于获取隐式原型链。ECMAScript 标准中确实存在 Reflect 对象(注意拼写是 Reflect,不是 Reflector),但它是一组静态方法集合(如 Reflect.get()、Reflect.setPrototypeOf() 等),不提供遍历或获取完整原型链的能力。
真正用来动态获取实例隐式原型链的标准方式,是靠 Object.getPrototypeOf() 配合循环调用,而不是 Reflect。
✅ 正确做法:用 Object.getPrototypeOf() 动态获取隐式原型链
每个对象的隐式原型(即内部 [[Prototype]])可通过 Object.getPrototypeOf(obj) 安全获取,这是 ECMAScript 标准推荐方式(替代非标准的 obj.__proto__)。
function getPrototypeChain(obj) {
const chain = [];
let current = obj;
while (current !== null) {
chain.push(current);
current = Object.getPrototypeOf(current);
}
return chain;
}
// 示例
function Person(name) { this.name = name; }
const p = new Person('Alice');
console.log(getPrototypeChain(p));
// [p, Person.prototype, Object.prototype, null]这个链清晰展示了:
- 实例
p自身 - →
Person.prototype(构造函数的显式原型) - →
Object.prototype(所有对象的终极原型) - →
null(原型链终点)
❌ 常见误区澄清
Reflect不能获取原型链Reflect没有getPrototype()或类似方法;它不负责原型操作,只封装部分底层操作(如Reflect.get是对obj[prop]的反射式调用)。__proto__是非标准、已废弃的访问方式
尽管多数浏览器支持,但已被 ES 规范标记为遗留特性,生产环境应避免直接使用。constructor.prototype不可靠
实例的constructor可能被篡改(如p.constructor = null),不能依赖它反推原型。
? 补充:验证原型链关系的实用方法
| 目的 | 推荐方法 | 说明 |
|---|---|---|
| 获取对象的直接隐式原型 | Object.getPrototypeOf(obj) |
安全、标准、兼容性好 |
| 判断 A 是否在 B 的原型链上 | B.prototype.isPrototypeOf(A) |
比 instanceof 更底层、更灵活 |
| 判断对象是否由某构造函数创建 | obj instanceof Constructor |
依赖 Constructor.prototype 在原型链中 |
| 创建指定原型的新对象 | Object.create(proto) |
显式设置新对象的 [[Prototype]]
|
不复杂但容易忽略的是:原型链本质就是一串由 Object.getPrototypeOf() 串联起来的对象序列,终点恒为 null。只要从实例出发,逐级向上取,就能完整还原。

















