最可靠的方式是用 object.getprototypeof() 逐层查询:实例的直接原型是子类 prototype,子类构造函数原型指向父类构造函数,子类 prototype 的原型是父类 prototype;不推荐使用非标准的 __proto__。

直接用 Object.getPrototypeOf() 一层层查最可靠,它能清晰展现子类实例、子类构造函数、父类构造函数之间的原型连接关系。
查子类实例的直接原型
子类 new 出来的对象,它的直接原型是子类的 prototype 对象:
-
Object.getPrototypeOf(instance) === SubClass.prototype→ 返回 true - 这和 ES5 构造函数实例的行为完全一致,不是新规则,只是写法变了
查子类构造函数的原型
子类构造函数(即 class 本身)的原型指向父类构造函数,这是 extends 的核心实现:
-
Object.getPrototypeOf(SubClass) === ParentClass→ 返回 true - 比如
class Dog extends Animal,那么Object.getPrototypeOf(Dog) === Animal - 这个链接让子类能继承父类的静态方法和属性
查子类 prototype 的原型
子类的 prototype 对象,其原型是父类的 prototype,这样实例才能访问父类原型上的方法:
-
Object.getPrototypeOf(SubClass.prototype) === ParentClass.prototype→ 返回 true - 这就是实例调用
speak()却能在Animal.prototype上找到的原因 - 这条链构成了“方法继承”的主干
不推荐直接用 __proto__
__proto__ 虽然在多数环境可用,但它不是标准属性,只是历史遗留的访问方式:
- 它在严格模式下可能被禁用,某些嵌入式 JS 引擎不支持
- 调试时容易混淆:实例有
__proto__,类也有__proto__,但含义不同 -
Object.getPrototypeOf()是唯一标准、安全、可读性强的获取方式











