JavaScript 没有 _extends 关键字,正确语法是 extends(无下划线),必须配合 class 和 super() 使用;手动写 _extends 无效且易引发错误。

JavaScript 没有 _extends 关键字,这是常见误解。ES6 的继承用的是 extends(不带下划线),且必须配合 class 和 super() 使用;直接写 _extends 会报 ReferenceError 或静默失败。
class extends 是唯一标准语法
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`;
}
}
为什么有人写 _extends?可能是混淆了 Babel 编译产物
Babel 将 class extends 编译为 ES5 时,会生成一个叫 _inherits 的辅助函数(注意是 _inherits,不是 _extends),内部用 Object.setPrototypeOf 和 Object.create 模拟原型链继承。这个函数名是 Babel 内部实现细节,开发者不应直接使用或依赖。
- 手动写
_extends不会触发任何继承逻辑,只是声明了一个未定义变量 - 若在代码里看到类似
var _extends = ...,基本是旧版 Babel 输出的辅助代码,不是语言特性 - 现代 TypeScript 或打包工具默认已启用
transform-classes,无需关心这些辅助函数
想兼容老环境?别碰 _extends,用标准写法 + 正确配置
如果目标环境不支持 class(如 IE11),正确做法是让构建工具(Vite、Webpack、Babel)自动转换,而不是手写“模拟继承”代码。
立即学习“Java免费学习笔记(深入)”;
- Babel 需启用
@babel/preset-env并设置targets,它会自动注入_inherits等辅助函数 - 不要手动复制 Babel 输出的
_inherits辅助函数到源码中——它依赖其他辅助函数(如_classCallCheck),且版本间不兼容 - 若真要手写 ES5 继承,应直接用
Child.prototype = Object.create(Parent.prototype)+Child.prototype.constructor = Child,而非虚构_extends
真正要注意的是:子类构造函数里漏掉 super()、父类没有构造函数却传参、或者用箭头函数覆盖了 super() 调用——这些才是实际开发中最常卡住的地方。











