extends不是新机制,而是对原型链继承的自动化封装:引擎静态设置b.prototype.__proto__指向a.prototype实现方法继承,b.__proto__指向a实现静态继承,并强制super()初始化this以挂载父类状态。

JavaScript 中 extends 关键字不是新机制,而是对原型链继承的自动化封装——它在类定义阶段由引擎静态完成三项关键设置,确保继承安全、可推断、可调试。
原型链自动连接:子类实例能访问父类方法
当你写 class B extends A,JavaScript 引擎立即把 B.prototype.__proto__ 指向 A.prototype。这一步让 new B() 创建的实例,在调用方法时能沿原型链向上查找到 A.prototype 上的方法(比如 instance.sayName())。
- 该链接是隐式、不可枚举的,不会出现在
Object.keys(B.prototype)中 - 等价于手动执行
Object.setPrototypeOf(B.prototype, A.prototype),但 extends 是编译期自动完成,更可靠 - 不依赖运行时赋值,避免因顺序错误导致继承失效
构造函数继承:静态成员自然可用
extends 同时设置 B.__proto__ === A,使子类本身可以调用父类的静态方法和属性(如 B.create() 或 B.VERSION)。
- 静态查找走的是构造函数的 [[Prototype]] 链:B → A → Function.prototype
- 静态属性本身不被继承,但静态方法可通过原型链访问
- 手动模拟需额外调用
Object.setPrototypeOf(B, A),extends 一步到位
super() 的强制初始化:保障 this 正确挂载父类状态
子类构造函数中必须第一行调用 super(),否则访问 this 会直接抛出 ReferenceError。
-
super()以子类即将创建的空对象为this,调用父类构造器,把this.name = name等逻辑执行并挂载到该实例上 - 跳过它,
this不是undefined,而是根本不可访问 - 若父类构造器返回对象,子类
this会被替换为该返回值(极少见,但属规范行为)
与手动继承的本质差异
仅靠 Object.setPrototypeOf(Child.prototype, Parent.prototype) 无法完整替代 extends:
- 不触发
super()强制检查,容易遗漏父类初始化 - 不自动设置
Child.__proto__ = Parent,静态继承需手动补全 - 不支持公有字段(
name = 'x')和私有字段(#id)的声明时序初始化
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











