js中子类继承父类静态属性是引擎在类声明时手动浅拷贝完成的,而非通过原型链自动继承;静态属性直接挂载在类自身,extends会遍历父类自身可枚举静态属性赋值给子类。

JS 中子类继承父类静态属性,不是靠原型链自动传递的,而是由 JavaScript 引擎在类声明阶段手动复制完成的。
静态属性不走原型链
静态属性(如 Animal.type = "哺乳动物")是直接挂在类(即构造函数)对象自身上的,不属于实例,也不在 prototype 上,因此不会被 __proto__ 或 prototype 链自然继承。也就是说:
– 子类的 constructor 不会自动拥有父类的静态属性;
– Child.__proto__ === Parent 这个关系虽存在,但引擎**并不依赖它来查找静态属性**——实际是语法层面的显式赋值。
extends 触发静态属性“浅拷贝”
当使用 class Child extends Parent 时,引擎会在解析 class 时执行类似以下逻辑:
- 让
Child.__proto__ = Parent(建立构造函数间的继承关系); - 遍历
Parent自身的所有可枚举静态属性(不含原型链上的),逐个赋值给Child; - 这个过程发生在类定义阶段,不是运行时动态查找。
例如:
class Parent { static x = 1; static y = { a: 2 }; }
class Child extends Parent {}
console.log(Child.x); // 1 → 成功访问
console.log(Child.y.a); // 2 → 浅拷贝,引用仍共享
static 方法和普通静态属性一样被继承
static 方法本质也是函数类型的静态属性,所以同样被上述机制复制。注意:
– 它们不是通过 Child.__proto__.methodName() 动态调用的;
– 而是 Child.methodName 在定义时就被设为与 Parent.methodName 相同的函数引用。
手动添加/覆盖静态属性不影响继承链
你可以在 class Child extends Parent 后再写 Child.z = 3,或重写 Child.x = 99,这只会修改 Child 自身,不会影响 Parent,也不会破坏继承关系。反过来,后续改 Parent.x 也**不会同步更新** Child.x —— 因为复制只发生一次,在类声明时。











