es6的class和extends是es5寄生组合继承的语法糖,核心通过call实现属性继承、object.create重建原型链、校验this初始化及setprototypeof转发静态成员。

ES6 的 class 和 extends 并非新继承模型,而是对 ES5 寄生组合继承的语法封装。Babel 等工具转译时,会将其还原为标准的函数+原型操作,核心目标是:既让子类实例拥有父类构造函数初始化的属性(避免引用共享),又让子类原型正确链接到父类原型(复用方法)。整个流程围绕三个关键环节展开。
1. 构造函数调用链:用 call 实现属性继承
子类构造函数中调用 super(),转译后实际执行的是 Parent.call(this, ...args)。这一步确保每个子类实例都独立执行父类构造逻辑,从而获得自己的实例属性(如 this.name、this.colors = ['red']),彻底规避原型链继承中引用类型被所有实例共享的问题。
2. 原型链重建:用 Object.create 接续方法继承
转译器不会直接赋值 Child.prototype = new Parent()(那会触发父类构造函数并污染原型)。而是生成类似这样的代码:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
Child.prototype = Object.create(Parent.prototype);
这一步仅建立原型链连接,不执行父类构造函数。随后手动修复构造器指向:Child.prototype.constructor = Child;
保证 instance.constructor 正确返回子类本身。
3. 实例初始化校验:防止 this 未定义
转译后会在子类构造函数开头插入检查逻辑(如 Babel 生成的 _classCallCheck 和 _possibleConstructorReturn):
- 强制要求必须先调用
super(),否则抛出"this hasn't been initialised"错误 - 确保
super()返回的是合法对象,再将该对象作为this继续使用 - 这一层防护是 ES6 class 语义强约束的体现,ES5 手写寄生组合继承时需自行实现类似逻辑
4. 静态方法与属性的自动转发
ES6 中子类能直接访问父类静态方法(如 Child.sayHello()),转译后通过 Object.setPrototypeOf(Child, Parent) 建立静态继承链。这样子类构造函数自身就成为父类构造函数的子对象,静态成员自然可沿这条链向上查找,无需额外复制。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










