Object.getPrototypeOf(Child) 返回 Parent 是正确设计,因 class 是函数语法糖,Child.__proto__ 指向 Parent 以继承静态成员;实例原型链(Child.prototype.__proto__)与类自身原型链(Child.__proto__)分离;传统构造函数无法自动继承静态属性,而 class extends 可;仅凭 Object.getPrototypeOf 判断继承关系有局限,应结合 prototype 链或循环遍历。

当你在 JavaScript 中对一个 类(class)本身 调用 Object.getPrototypeOf(Child),它返回的是父类(如 Parent),这并不是 bug,而是 class 语法底层设计的明确行为——它反映的是类函数对象自身的原型链,而非实例的原型链。
类本身是函数,它的 [[Prototype]] 指向父类
ES6 的 class 是函数的语法糖。定义 class Child extends Parent 后,Child 本身是一个函数对象(typeof Child === 'function')。引擎会自动设置:
-
Child.__proto__ === Parent(即Object.getPrototypeOf(Child) === Parent) - 这层关系让子类能直接继承父类的静态方法和静态属性
- 比如
Parent.staticMethod()可被Child.staticMethod()调用,靠的就是这个原型链接
实例的原型链和类的原型链是两回事
别混淆这两个路径:
- 实例的
__proto__指向Child.prototype -
Child.prototype.__proto__才指向Parent.prototype - 所以
new Child().method()能访问父类实例方法,靠的是Child.prototype的原型链 - 而
Child.staticMethod()能访问,靠的是Child函数自身的[[Prototype]]
和传统构造函数继承的关键区别
旧写法 function Child() {} 配合 Child.prototype = new Parent() 不会改变 Child.__proto__:
立即学习“Java免费学习笔记(深入)”;
- 此时
Child.__proto__ === Function.prototype,不是Parent - 子类无法继承父类静态成员,除非手动赋值(如
Child.staticFn = Parent.staticFn) -
class extends自动完成这一步,是语法糖的重要增强点
运行时检查继承关系要谨慎
仅靠 Object.getPrototypeOf(Child) === Parent 判断“是否继承”看似可行,但有局限:
- 它只适用于直接
extends的一级父类,不支持多级或混入(mixin)场景 - 若类被动态修改(如重设
__proto__),结果可能失真 - 更健壮的方式是结合
Child.prototype instanceof Parent(查实例链)或Reflect.getPrototypeOf+ 循环遍历
文章来自机圈观察员网,发布者:,转载请注明出处:https://www.jqgcy.com/shoujipingce/123705.html