es6中静态方法通过构造函数原型链继承,子类自动获得父类静态方法访问权;静态方法只存在于类构造函数上,不能通过实例调用,如animal.run()✅而new animal().run()❌。

ES6 中 static 方法的继承不是靠原型链传递给实例,而是通过**构造函数(类本身)的原型链**向上查找,子类自动获得父类静态方法的访问权。
静态方法属于类本身,不挂载在实例或原型上
定义了 static 的方法,只存在于类的构造函数对象上,不会出现在 prototype 或实例的 __proto__ 链中。所以你不能用 new Cat().run() 调用,只能写 Cat.run()。
例如:
class Animal {
static run() { return 'running'; }
}
const a = new Animal();
a.run(); // TypeError: a.run is not a function
Animal.run(); // ✅ 'running'
子类自动继承父类的静态方法
使用 extends 后,子类构造函数的内部 [[Prototype]] 会指向父类构造函数(即 Child.__proto__ === Parent),因此能顺着这条链访问父类静态成员。
-
Fish extends Animal→Fish.run()可直接调用Animal.run() - 不需要显式复制,也不依赖
super在构造函数里做任何操作 - 本质是 JavaScript 构造函数对象之间的隐式原型链继承
子类可重写或扩展父类静态方法
子类可以定义同名 static 方法覆盖父类行为;若需复用父逻辑,可用 super.方法名()(ES2022+ 支持,在静态方法内有效)。
class Animal {
static info() { return 'animal'; }
}
class Dog extends Animal {
static info() {
return super.info() + ' + dog'; // ✅ 可以调用
}
}
Dog.info(); // 'animal + dog'
注意:实例和原型都拿不到静态方法
哪怕子类继承了父类,它的实例、子类原型(Dog.prototype)、甚至 Dog.prototype.__proto__ 都没有静态方法。
- 静态方法只存在于类(构造函数)及其向上构造函数链上
-
Dog.__proto__ === Animal是关键链路 - 误以为“静态方法被实例继承”是常见误解











