javascript的Class类怎样实现继承?【教程】

发布时间 - 2026-01-27 00:00:00    点击率:
JavaScript类继承需在子类构造函数首行调用super(),否则报错;super()必须在访问this前执行;可调用父类方法、静态成员;继承内置类需额外处理以确保行为正确。

JavaScript 的 Class 继承用 extends + super() 实现,但必须注意构造函数中调用 super() 的时机和必要性,否则会直接报错。

子类构造函数里必须显式调用 super()

ES6 的 class 继承不是“自动完成”的。如果子类定义了 constructor,就必须在第一行调用 super(),否则会抛出 ReferenceError: Must call super constructor in derived class before accessing 'this' or returning from derived constructor

  • super() 必须在访问 this 之前调用(包括给 this.xxx 赋值、调用 this.method()
  • 如果子类没写 constructor,JS 引擎会自动插入一个空的 constructor(...args) { super(...args); }
  • 传给 super() 的参数,就是父类构造函数期望接收的参数
class Animal {
  constructor(name) {
    this.name = name;
  }
}
class Dog extends Animal {
  constructor(name, breed) {
    super(name); // ✅ 必须先调用
    this.breed = breed; // ✅ 此时 this 才可用
  }
}

super 不只是调用父构造函数,还能访问父类方法和属性

super 在子类实例方法中不是关键字,而是一个特殊的引用对象,可用来调用父类的同名方法(包括 constructor),也能读取父类的 get 访问器或原型上的属性。

  • 在方法内部用 super.xxx() 调用父类方法(如 super.toString()
  • 不能在静态方法里用 super() 调构造函数,但可以用 super.xxx 访问父类静态属性或方法
  • super 指向的是父类的 prototype,不是父类实例
class Animal {
  speak() { return `I'm ${this.name}`; }
}
class Dog extends Animal {
  speak() {
    return super.speak() + ' — woof!'; // ✅ 复用父逻辑
  }
}

静态方法和静态属性的继承规则容易被忽略

子类会继承父类的静态方法(通过 Class.staticMethod),但不会自动继承静态属性(ES2025+ 支持公有静态字段,但不会被子类“继承”为自有属性)。

  • 静态方法可通过 super.staticMethod() 在子类静态方法中调用
  • 父类的 static get xxx() {} 可被子类通过 super.xxx 访问
  • 子类若未定义同名静态字段,访问 Child.staticProp 会沿原型链找到父类定义(仅限 getter/setter 或方法;普通静态字段不参与原型链查找)
class Animal {
  static kingdom = 'Animalia

'; static info() { return 'A living organism'; } } class Dog extends Animal {} console.log(Dog.kingdom); // ✅ 'Animalia'(仅当父类用 getter 或是旧式赋值时才可读) console.log(Dog.info()); // ✅ 'A living organism'

继承内置类(如 ArrayError)需要额外小心

继承 ArrayMapError 等内置类时,仅靠 extendssuper() 不足以让实例具备完整行为(比如 Array 子类实例可能没有 .length 自动更新或 for...of 支持)。

  • V8(Chrome/Node.js)对内置类继承支持较好,但 Safari 和部分旧环境仍有缺陷
  • 继承 Error 时,需手动设置 this.namethis.message,否则 instanceof 可能失效
  • 推荐优先使用组合(composition)替代继承内置类,除非明确需要 instanceof 行为
class MyError extends Error {
  constructor(message) {
    super(message);
    this.name = 'MyError'; // ✅ 必须补上,否则 .name 是 'Error'
    // 还建议加:Object.setPrototypeOf(this, MyError.prototype);
  }
}

真正麻烦的不是语法,而是 super() 的调用约束、静态成员的查找规则,以及内置类继承在不同引擎下的行为差异——这些地方一旦出错,错误信息往往不直观,调试成本远高于普通逻辑问题。


# javascript  # es6  # java  # js  # node.js  # node  # access  # safari  # speak  # chrome  # Static  # Array  # for  # 父类  # 子类  # 构造函数  # Error  # 继承  # class  # Length  # 访问器  # map 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: Laravel如何优化应用性能?(缓存和优化命令)  Laravel 419 page expired怎么解决_Laravel CSRF令牌过期处理  大同网页,大同瑞慈医院官网?  如何用西部建站助手快速创建专业网站?  javascript如何操作浏览器历史记录_怎样实现无刷新导航  Laravel如何实现密码重置功能_Laravel密码找回与重置流程  猪八戒网站制作视频,开发一个猪八戒网站,大约需要多少?或者自己请程序员,需要什么程序员,多少程序员能完成?  Laravel如何使用Sanctum进行API认证?(SPA实战)  安克发布新款氮化镓充电宝:体积缩小 30%,支持 200W 输出  零服务器AI建站解决方案:快速部署与云端平台低成本实践  做企业网站制作流程,企业网站制作基本流程有哪些?  如何快速搭建高效服务器建站系统?  Python制作简易注册登录系统  北京企业网站设计制作公司,北京铁路集团官方网站?  Laravel如何使用Socialite实现第三方登录?(微信/GitHub示例)  如何为不同团队 ID 动态生成多个“认领值班”按钮  如何在阿里云完成域名注册与建站?  html5audio标签播放结束怎么触发事件_onended回调方法【教程】  晋江文学城电脑版官网 晋江文学城网页版直接进入  如何利用DOS批处理实现定时关机操作详解  如何彻底卸载建站之星软件?  微博html5版本怎么弄发语音微博_语音录制入口及时长限制操作【教程】  如何快速搭建虚拟主机网站?新手必看指南  利用JavaScript实现拖拽改变元素大小  ChatGPT 4.0官网入口地址 ChatGPT在线体验官网  如何在阿里云域名上完成建站全流程?  油猴 教程,油猴搜脚本为什么会网页无法显示?  Laravel如何生成和使用数据填充?(Seeder和Factory示例)  Laravel如何连接多个数据库_Laravel多数据库连接配置与切换教程  如何在阿里云虚拟主机上快速搭建个人网站?  BootStrap整体框架之基础布局组件  动图在线制作网站有哪些,滑动动图图集怎么做?  iOS正则表达式验证手机号、邮箱、身份证号等  实例解析angularjs的filter过滤器  Laravel如何使用缓存系统提升性能_Laravel缓存驱动和应用优化方案  Laravel如何实现用户密码重置功能?(完整流程代码)  如何在新浪SAE免费搭建个人博客?  怎么制作网站设计模板图片,有电商商品详情页面的免费模板素材网站推荐吗?  Laravel DB事务怎么使用_Laravel数据库事务回滚操作  Laravel Octane如何提升性能_使用Laravel Octane加速你的应用  Laravel Seeder填充数据教程_Laravel模型工厂Factory使用  Laravel如何安装Breeze扩展包_Laravel用户注册登录功能快速实现【流程】  Laravel如何实现API资源集合?(Resource Collection教程)  网页制作模板网站推荐,网页设计海报之类的素材哪里好?  Laravel如何处理和验证JSON类型的数据库字段  Mybatis 中的insertOrUpdate操作  如何用景安虚拟主机手机版绑定域名建站?  如何在万网开始建站?分步指南解析  javascript基于原型链的继承及call和apply函数用法分析  制作公司内部网站有哪些,内网如何建网站?