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'
继承内置类(如 Array、Error)需要额外小心
继承 Array、Map、Error 等内置类时,仅靠 extends 和 super() 不足以让实例具备完整行为(比如 Array 子类实例可能没有 .length 自动更新或 for...of 支持)。
- V8(Chrome/Node.js)对内置类继承支持较好,但 Safari 和部分旧环境仍有缺陷
- 继承
Error时,需手动设置this.name和this.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报错的快速解决方法


