javascript中静态属性继承通过子类构造函数的[[prototype]]链(child.__proto__)实现,而非原型链;extends自动执行object.setprototypeof(child, parent),使child可直接访问parent的静态成员。

JavaScript 中静态属性继承不是靠原型链挂载到子类构造函数的,而是通过构造函数自身的 [[Prototype]] 链(即 Child.__proto__)实现的。
静态成员不走实例原型链,走构造函数原型链
静态方法和属性属于类(构造函数)本身,不是其实例或原型上的东西。所以它们的查找路径是:
- 访问
Child.staticMethod()时,引擎先查Child自身是否有该属性; - 没有则沿
Child.__proto__向上找 —— 这条链默认被extends设为Parent; - 再往上是
Parent.__proto__(通常是Function.prototype)。
ES6 extends 自动设置 Child.__proto__ = Parent
当你写 class Child extends Parent,JS 引擎会自动执行类似:
Object.setPrototypeOf(Child, Parent);
这一步让子类构造函数能直接继承父类的静态成员,无需手动遍历复制。例如:
class Parent { static foo() { return 'from parent'; } }<br>class Child extends Parent {}<br>console.log(Child.foo()); // 'from parent'
手动模拟需显式设置 __proto__ 或用 Object.setPrototypeOf
如果不用 extends,而是用函数模拟类,要实现静态继承,必须手动建立构造函数间的原型连接:
- 不能只设
Child.prototype.__proto__ = Parent.prototype(那是实例方法继承); - 必须设
Child.__proto__ = Parent,才能让Child.bar()找到Parent.bar(); - 也可用
Object.setPrototypeOf(Child, Parent),效果相同。
注意:不要混淆 prototype 和 __proto__ 的作用域
常见误区是试图把静态属性“挂到 Child.prototype 上”——这是无效的,因为 prototype 只影响实例,不影响构造函数自身。静态成员必须放在构造函数对象上,靠其 __proto__ 链查找。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











