子类通过 extends 继承父类时静态方法自动继承,因子类构造函数的 proto 指向父类构造函数,支持直接调用、覆盖或通过 super 调用;实例无法访问静态方法。

子类通过 extends 继承父类时,静态方法会自动被子类继承,无需额外操作——这是 ES6 class 机制的默认行为。
静态方法继承是自动且直接的
只要父类定义了 static 方法,子类就能直接通过类名调用,不需要在子类中重复声明或手动复制。这是因为 extends 会在背后设置子类构造函数的 __proto__ 指向父类构造函数,从而让静态成员沿构造函数链向上查找。
-
A.__proto__ === Function.prototype(所有函数/类的顶层原型) -
B.__proto__ === A(class B extends A后成立) - 所以
B.staticMethod()会先查B自身,没找到就查B.__proto__(即A),自然命中父类 static 方法
子类可以覆盖或扩展父类静态方法
如果子类定义了同名的 static 方法,就会覆盖父类版本;也可以在子类 static 方法中用 super 调用父类实现(仅限静态上下文):
-
super.methodName()在子类 static 方法内可用,此时 super 指向父类构造函数 - 例如:
static init() { return super.init().then(...); } - 注意:super 在静态方法中不是对象,不能解构或赋值给变量,只支持
super.xxx()调用
实例无法访问静态方法,和继承无关
静态方法属于类本身,不挂载在原型上,因此无论是否继承,都不能通过实例调用:
立即学习“Java免费学习笔记(深入)”;
-
new B().foo()→ 报错:foo is not a function - 必须写成
B.foo()或A.foo() - 这个限制与 extends 无关,是 static 本身的语义决定的
验证继承关系的小技巧
可以通过以下代码确认静态继承是否生效:
console.log(B.__proto__ === A); // trueconsole.log(typeof B.parentStaticMethod === 'function'); // true(如果 A 定义了该方法)</li> <li><code>console.log(B.parentStaticMethod === A.parentStaticMethod); // true(引用相同)


















