17370845950

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

JavaScript 没有 _extends 关键字,这是常见误解。ES6 的继承用的是 extends(不带下划线),且必须配合 classsuper() 使用;直接写 _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.setPrototypeOfObject.create 模拟原型链继承。这个函数名是 Babel 内部实现细节,开发者不应直接使用或依赖。

  • 手动写 _extends 不会触发任何继承逻辑,只是声明了一个未定义变量
  • 若在代码里看到类似 var _extends = ...,基本是旧版 Babel 输出的辅助代码,不是语言特性
  • 现代 TypeScript 或打包工具默认已启用 transform-classes,无需关心这些辅助函数

想兼容老环境?别碰 _extends,用标准写法 + 正确配置

如果目标环境不支持 class(如 IE11),正确做法是让构建工具(Vite、Webpack、Babel)自动转换,而不是手写“模拟继承”代码。

  • Babel 需启用 @babel/preset-env 并设置 targets,它会自动注入 _inherits 等辅助函数
  • 不要手动复制 Babel 输出的 _inherits 辅助函数到源码中——它依赖其他辅助函数(如 _classCallCheck),且版本间不兼容
  • 若真要手写 ES5 继承,应直接用 Child.prototype = Object.create(Parent.prototype) + Child.prototype.constructor = Child,而非虚构 _extends

真正要注意的是:子类构造函数里漏掉 super()、父类没有构造函数却传参、或者用箭头函数覆盖了 super() 调用——这些才是实际开发中最常卡住的地方。