JavaScript 中 Object.getPrototypeOf 在类继承中的运行机制

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

javascript 中 object.getprototypeof 在类继承中的运行机制

当你在 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

如何在 macOS 中通过终端查看当前公网 IP
上一篇 2026-07-01 12:52
Nginx 中 proxy?cache?background?update 怎么实现异步更新
下一篇 2026-07-01 12:52

相关推荐