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


相关推荐: 用yum安装MySQLdb模块的步骤方法  JS中使用new Date(str)创建时间对象不兼容firefox和ie的解决方法(两种)  Windows10电脑怎么查看硬盘通电时间_Win10使用工具检测磁盘健康  Edge浏览器如何截图和滚动截图_微软Edge网页捕获功能使用教程【技巧】  详解ASP.NET 生成二维码实例(采用ThoughtWorks.QRCode和QrCode.Net两种方式)  Laravel如何实现本地化和多语言支持_Laravel多语言配置与翻译文件管理  如何确认建站备案号应放置的具体位置?  如何基于云服务器快速搭建个人网站?  Laravel如何使用Telescope进行调试?(安装和使用教程)  长沙做网站要多少钱,长沙国安网络怎么样?  Laravel怎么实现观察者模式Observer_Laravel模型事件监听与解耦开发【指南】  软银砸40亿美元收购DigitalBridge 强化AI资料中心布局  齐河建站公司:营销型网站建设与SEO优化双核驱动策略  Microsoft Edge如何解决网页加载问题 Edge浏览器加载问题修复  如何在阿里云虚拟主机上快速搭建个人网站?  Android okhttputils现在进度显示实例代码  如何在建站之星绑定自定义域名?  Python并发异常传播_错误处理解析【教程】  如何在云主机上快速搭建多站点网站?  如何确保西部建站助手FTP传输的安全性?  详解阿里云nginx服务器多站点的配置  Laravel如何记录自定义日志?(Log频道配置)  JS去除重复并统计数量的实现方法  Laravel如何实现URL美化Slug功能_Laravel使用eloquent-sluggable生成别名【方法】  php8.4header发送头信息失败怎么办_php8.4header函数问题解决【解答】  微信小程序 wx.uploadFile无法上传解决办法  Laravel控制器是什么_Laravel MVC架构中Controller的作用与实践  C++用Dijkstra(迪杰斯特拉)算法求最短路径  html5怎么画眼睛_HT5用Canvas或SVG画眼球瞳孔加JS控制动态【绘制】  Laravel如何实现多表关联模型定义_Laravel多对多关系及中间表数据存取【方法】  rsync同步时出现rsync: failed to set times on “xxxx”: Operation not permitted  Laravel怎么配置S3云存储驱动_Laravel集成阿里云OSS或AWS S3存储桶【教程】  Bootstrap CSS布局之列表  jquery插件bootstrapValidator表单验证详解  Laravel模型事件有哪些_Laravel Model Event生命周期详解  微信小程序 scroll-view组件实现列表页实例代码  Laravel DB事务怎么使用_Laravel数据库事务回滚操作  网站制作企业,网站的banner和导航栏是指什么?  公司门户网站制作公司有哪些,怎样使用wordpress制作一个企业网站?  Laravel如何发送邮件和通知_Laravel邮件与通知系统发送步骤  Laravel如何优化应用性能?(缓存和优化命令)  Laravel中DTO是什么概念_在Laravel项目中使用数据传输对象(DTO)  阿里云高弹*务器配置方案|支持分布式架构与多节点部署  家族网站制作贴纸教程视频,用豆子做粘帖画怎么制作?  如何快速搭建安全的FTP站点?  制作无缝贴图网站有哪些,3dmax无缝贴图怎么调?  如何登录建站主机?访问步骤全解析  如何基于云服务器快速搭建网站及云盘系统?  网站广告牌制作方法,街上的广告牌,横幅,用PS还是其他软件做的?  PHP 500报错的快速解决方法