静态方法属于构造函数自身而非原型链,需手动继承或通过ES6 class语法自动继承。例如Animal.eat()可调用而a.eat()报错;子类继承父类静态成员须遍历hasOwnProperty复制,class extends则自动完成此过程。

静态方法不会通过原型链传承。它们属于构造函数本身,不参与实例或原型链的属性查找过程。
静态方法的本质是函数自身的属性
JavaScript 中的静态方法(如 Array.from、Object.keys)直接挂在函数对象上,和它的 prototype 无关。例如:
function Animal() {}
Animal.eat = function() { console.log('static eat'); }; // 静态方法
Animal.prototype.run = function() { console.log('run'); }; // 原型方法
const a = new Animal();
a.eat(); // ❌ 报错:a.eat is not a function
Animal.eat(); // ✅ 正确:直接调用函数本身
a.run(); // ✅ 正确:通过原型链找到 run
这里 eat 是 Animal 函数的一个自有属性,不是它原型链的一部分。
静态属性和方法需要手动继承
如果子类想复用父类的静态方法,必须显式复制,不能靠 Child.prototype = new Parent() 这类原型链操作。常见做法是遍历父类自身属性:
立即学习“Java免费学习笔记(深入)”;
- 使用
for...in+hasOwnProperty判断是否为自有属性 - 把匹配到的键值对赋给子类函数自身
function Parent() {}
Parent.staticMethod = function() { return 'I am static'; };
Parent.staticProp = 42;
function Child() {}
// 手动继承静态成员
for (let key in Parent) {
if (Parent.hasOwnProperty(key)) {
Child[key] = Parent[key];
}
}
console.log(Child.staticMethod()); // "I am static"
console.log(Child.staticProp); // 42
ES6 class 中的 static 继承是语法糖支持
虽然底层仍是原型机制,但 class 语法让静态继承更直观:
class Parent {
static say() { return 'hello'; }
}
class Child extends Parent {} // ✅ 自动继承 Parent 的 static 方法
console.log(Child.say()); // "hello"
这背后是引擎自动执行了类似上面的手动复制逻辑,并非原型链自动传递。
不复杂但容易忽略:原型链只管实例和 prototype 上的方法;静态方法要走“函数到函数”的显式拷贝路径。


















