es6 class继承本质是babel注入\_classcallcheck、\_inherits、\_createsuper三个辅助函数实现的原型链重建:前者确保new调用,中者设置静态与实例继承,后者代理super()调用父构造函数并绑定this。

要真正看懂 ES6 class 继承的底层转译过程,不能只背“语法糖”三个字,得直接打开 Babel 转译器,把 class A extends B 拆成一行行 ES5 代码,再对照原型链和执行逻辑逐句验证。核心是抓住两个关键点:构造函数如何被包装、原型链如何被手动重建。
看懂 Babel 转译出的三类辅助函数
Babel 不是简单地把 class 改成 function,它注入了几个关键运行时辅助函数,每个都承担明确职责:
-
_classCallCheck:确保类必须用
new调用。它通过instance instanceof Constructor判断 this 是否合法,否则抛错。这是 class 与普通函数最硬的隔离边界。 -
_inherits:负责设置子类的原型链。它内部调用
Object.setPrototypeOf(Child, Parent)(设静态继承)和Object.setPrototypeOf(Child.prototype, Parent.prototype)(设实例方法继承),两步缺一不可。 -
_createSuper:生成一个可复用的
super调用代理。它返回一个函数,该函数在子类constructor中实际调用Parent.call(this, ...args),并确保this正确绑定——这正是super()的物理实现,不是魔法。
对照原型链三处关键指向
转译后的代码里,有三个 Object.getPrototypeOf 可验证的位置,它们共同构成 class 继承的骨架:
-
Object.getPrototypeOf(Child) === Parent→ 子类构造函数本身继承父类静态属性(比如Parent.staticMethod可被Child.staticMethod访问) -
Object.getPrototypeOf(Child.prototype) === Parent.prototype→ 子类实例方法链向父类原型,保证new Child().sayHi()能沿链找到 -
Object.getPrototypeOf(new Child()) === Child.prototype→ 实例第一层原型仍是自己的 prototype,符合 new 的基本语义
手写等效代码反向验证
不依赖 Babel,自己用原生 API 写一遍继承,能彻底暴露设计意图:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
function Parent(name) { this.name = name; }
Parent.prototype.say = function() { return 'hi'; };
function Child(name, id) {
Parent.call(this, name); // 相当于 super(name)
this.id = id;
}
// 手动建立原型链:等价于 _inherits(Child, Parent)
Object.setPrototypeOf(Child, Parent);
Object.setPrototypeOf(Child.prototype, Parent.prototype);
Child.prototype.constructor = Child;
// 验证
console.log(new Child('a', 1).say()); // 'hi'
console.log(Child.__proto__ === Parent); // true
这段代码和 Babel 输出逻辑完全一致,只是没加 _classCallCheck 安全检查。一旦补上,就和转译结果几乎一样。
注意 super() 在 constructor 中的真实行为
super() 不是调用父类构造函数那么简单。它隐含两个动作:
- 必须在子类
constructor中this初始化前调用(否则报错),因为 Babel 插入的_this = _possibleConstructorReturn(this, _getPrototypeOf(...).call(...))依赖它完成 this 绑定 - 它的返回值就是子类即将使用的
this对象,所以super()后才能给this.xxx赋值
换句话说,super() 是整个实例化流程中“交出控制权给父类、再拿回改造后 this”的关键交接点。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










