JavaScript中类的继承与方法覆盖由原型链查找机制决定:实例方法调用时,引擎从实例__proto__开始沿原型链向上查找首个匹配方法;extends自动构建三条链接确保继承路径;覆盖遵循就近原则,子类prototype同名方法优先于父类;super用于显式调用父类实现;静态方法与实例方法查找路径分离,互不干扰。

JavaScript中类的继承顺序和方法覆盖优先级,本质上由原型链查找机制决定:当访问一个实例的方法时,引擎会从实例自身开始,沿着__proto__(即constructor.prototype)逐级向上查找,直到找到第一个匹配的方法。这个过程决定了“谁的方法先被调用”。
继承链的构建顺序:extends 决定原型链走向
使用extends声明子类时,JavaScript 会自动设置三条关键链接:
- 子类的
prototype.__proto__指向父类的prototype(实现方法继承) - 子类的
__proto__指向父类(实现静态方法继承) - 实例的
__proto__指向子类的prototype(实例方法入口)
例如:class B extends A 后,new B() 的原型链是:B.prototype → A.prototype → Object.prototype。查找方法时严格按此顺序进行,不会跳过中间环节。
方法覆盖:就近原则,不依赖声明顺序
覆盖(override)只看运行时查找路径上的“第一个匹配”,与类定义中方法书写先后无关。只要子类prototype上有同名方法,它就一定会优先于父类中的同名方法被调用。
注意:即使子类中定义了多个同名方法(语法上合法但不推荐),后定义的会覆盖先定义的——这是普通对象属性赋值行为,不是继承机制本身。
super 调用:显式访问父级实现,不改变查找优先级
super.method() 是一种显式委托,它绕过当前对象,直接在父类prototype上查找并调用该方法。它不影响默认查找流程,只是提供了一种“手动降级”的能力。
常见用途包括:
- 在子类方法中补充逻辑后调用父类同名方法(如构造函数中必须先调
super()) - 重写 getter/setter 时复用父类的部分逻辑
- 避免无限递归(比如
toString()中调super.toString()而非this.toString())
静态方法与实例方法的优先级互不干扰
静态方法存在于类本身(即构造函数)上,通过Class.method()调用;实例方法存在于prototype上,通过instance.method()调用。二者存储位置不同、查找路径不同,不存在覆盖关系。
例如:B.foo() 查找的是B → A → Function.prototype;而new B().foo() 查找的是B.prototype → A.prototype → Object.prototype。即使名字相同,也是两个独立的方法。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











