JavaScript 没有 _extends 关键字,正确语法是 extends(无下划线),必须配合 class 和 super() 使用;手动写 _extends 无效且易引发错误。
JavaScript 没有 _extends 关键字,这是常见误解。ES6 的继承用的是 extends(不带下划线),且必须配合 class 和 super() 使用;直接写 _extends 会报 ReferenceE 或静默失败。
rror
ES6 规范只定义了 extends 作为类继承的关键字,它只能出现在 class 声明中,后面必须跟一个构造函数或另一个类(包括 null,但极少用)。
extends 不是函数、不是对象方法,不能单独调用或赋值super(),否则 this 不可用,会抛 ReferenceError: Must call super constructor in derived class before accessing 'this'
Object.setPrototypeOf(Child, Parent) 补齐(但不推荐)class Animal {
constructor(name) {
this.name = name;
}
speak() {
return `${this.name} makes a sound`;
}
}
class Dog extends Animal { // ✅ 正确:extends + class
constructor(name, breed) {
super(name); // ✅ 必须先调用
this.breed = breed;
}
bark() {
return `${this.name} barks`;
}
}
Babel 将 class extends 编译为 ES5 时,会生成一个叫 _inherits 的辅助函数(注意是 _inherits,不是 _extends),内部用 Object.setPrototypeOf 和 Object.create 模拟原型链继承。这个函数名是 Babel 内部实现细节,开发者不应直接使用或依赖。
_extends 不会触发任何继承逻辑,只是声明了一个未定义变量var _extends = ...,基本是旧版 Babel 输出的辅助代码,不是语言特性transform-classes,无需关心这些辅助函数如果目标环境不支持 class(如 IE11),正确做法是让构建工具(Vite、Webpack、Babel)自动转换,而不是手写“模拟继承”代码。
@babel/preset-env 并设置 targets,它会自动注入 _inherits 等辅助函数_inherits 辅助函数到源码中——它依赖其他辅助函数(如 _classCallCheck),且版本间不兼容Child.prototype = Object.create(Parent.prototype) + Child.prototype.constructor = Child,而非虚构 _extends
真正要注意的是:子类构造函数里漏掉 super()、父类没有构造函数却传参、或者用箭头函数覆盖了 super() 调用——这些才是实际开发中最常卡住的地方。