class继承通过extends静态建立两条独立原型链:实例方法链b.prototype.__proto__→a.prototype,静态方法链b.__proto__→a;重写prototype需手动修复constructor。

Class 继承本身不直接“修改” prototype,而是由 extends 语法在定义时自动设置两条关键原型链关系,本质是静态、一次性建立的链接,不是运行时动态修改。
Class.prototype.proto 指向父类原型
当写 class B extends A,JavaScript 引擎会自动让 B.prototype.__proto__ 指向 A.prototype。
这意味着:
- B 的实例能沿原型链查找到 A.prototype 上的方法(如
A.prototype.say()) - 这条链决定了实例方法的继承行为
- 它等价于手动执行
Object.setPrototypeOf(B.prototype, A.prototype),但这是引擎内部动作,不可见也不建议手动干预
constructor 的 prototype 链需保持独立
子类构造函数 B 自身的 prototype 属性(即 B.prototype)是一个新对象,它不等于 A.prototype,而是通过 __proto__ 与之关联。
所以:
- 修改
B.prototype.xxx不会影响A.prototype.xxx - 但若错误地写成
B.prototype = A.prototype,就会共用同一对象,导致意外覆盖
constructor 指针必须手动修复(如果重赋 prototype)
如果你显式重写了 B.prototype(比如用 Object.create(A.prototype)),必须紧接着设置:
B.prototype.constructor = B;
否则 new B() 实例的 constructor 会指向 A,造成识别和 instanceof 判断异常。
静态成员走的是另一条链:B.proto → A
B 作为函数对象,其自身的 __proto__ 被设为 A,因此 B.staticMethod() 可以访问 A.staticMethod()。
这条链和 B.prototype.__proto__ 是分离的——改其中一条,不影响另一条。
不复杂但容易忽略











