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 】
相关推荐:
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函数用法分析
制作公司内部网站有哪些,内网如何建网站?


