静态方法和属性通过构造函数原型链继承,子类的__proto__指向父类,故可访问父类静态成员;私有静态字段、后添加的静态属性及依赖私有状态的静态访问器存在继承限制。

静态方法和静态属性会被子类继承,这看似和“静态属于类自身”的直觉矛盾,其实关键在于:ES6 的继承机制对 静态成员 和 原型成员 采用了两套并行但对称的原型链。
静态成员也走原型链,只是链在构造函数上
类本身是一个函数对象,它也有自己的原型(Class.__proto__)。当使用 extends 时,JavaScript 不仅设置实例的原型链(Child.prototype.__proto__ === Parent.prototype),还会设置构造函数的原型链(Child.__proto__ === Parent)。
这就意味着:
- 父类的静态方法/属性,实际挂在
Parent函数对象上 - 子类的
__proto__指向父类,所以能顺着这条链向上查找 - 调用
Child.staticMethod()时,引擎先查Child自身,没找到就查Child.__proto__(即Parent),于是命中
子类可直接调用,也可用 super 显式调用
继承不等于覆盖。子类没有重写静态方法时,直接调用就是访问父类的实现;若需在子类静态方法中复用父类逻辑,可用 super:
-
Child.method()→ 自动沿Child.__proto__查找,等价于Parent.method() -
static method() { return super.method(); }→ 显式委托给父类静态方法,语义更清晰
注意:super 在静态方法中指向的是父类构造函数,不是原型对象。
静态与实例继承是正交的两套系统
一个类有两层“归属”:
- 实例方法/属性 → 定义在
Class.prototype上 → 被实例继承 - 静态方法/属性 → 定义在
Class构造函数自身上 → 被子类构造函数继承
二者互不影响。比如父类有个静态方法和一个原型方法,子类会同时获得这两者,但它们存在于完全不同的对象层级上。
不能被继承的例外情况
并非所有静态成员都无条件继承:
- 私有静态字段(
static #field)不会被子类访问,哪怕同名也无法读取 - 手动赋值的静态属性(如
Parent.prop = 'x')属于运行时挂载,若发生在class声明之后、extends之前,子类仍可继承;但若在子类定义之后才添加,则子类无法感知 - 静态 getter/setter 若依赖
this的私有状态,子类调用时可能因作用域限制而失效











