javascript如何实现继承_有哪些方法可以创建子类【教程】
发布时间 - 2026-01-28 00:00:00 点击率:次JavaScript中class继承必须用extends和super(),子类需显式继承单个父类并在构造函数中先调用super()再访问this;多重继承不支持,漏调或错序super()会抛ReferenceError。
JavaScript 中 class 继承必须用 extends 和 sup
er()

ES6 的 class 语法不支持多重继承,子类必须显式继承一个父类,并在构造函数中调用 super()——否则会报 ReferenceError: Must call super constructor in derived class before accessing 'this'。
常见错误是漏掉 super(),或在调用前访问 this(比如先写 console.log(this) 再写 super()),这都会直接抛错。
-
extends后只能跟一个构造函数或null(极少见) -
super()必须在使用this前调用,且仅限于子类构造函数内 - 若父类构造函数需要参数,
super(...args)必须传对应参数
原型链继承:手动改 Child.prototype.__proto__ 或用 Object.setPrototypeOf()
这是最底层的继承方式,绕过 class 语法,直接操作原型。适合需要动态继承、或兼容老环境(如 IE11)的场景,但易出错且可读性差。
不要直接赋值 Child.prototype = Parent.prototype——这会让子类和父类共享同一原型对象,修改子类原型会影响父类。
- 推荐写法:
Object.setPrototypeOf(Child.prototype, Parent.prototype) - 构造函数内部仍需手动调用
Parent.call(this, ...)实现实例属性继承 - 注意:V8 引擎对
Object.setPrototypeOf()有性能警告,频繁调用会影响优化
组合继承(构造函数 + 原型链)仍是兼容性最强的通用方案
它同时解决实例属性继承(靠 Parent.call(this))和方法复用(靠原型链),没有寄生组合继承的额外函数开销,也没有 ES6 class 的语法限制。
典型结构是:子类构造函数里执行一次 Parent.call(this, ...);再用 Object.setPrototypeOf() 或 Child.prototype = Object.create(Parent.prototype) 设置原型关系。
- 避免在子类原型上直接写
constructor属性,否则会丢失原始构造器引用 - 如果用
Object.create(Parent.prototype),记得补上Child.prototype.constructor = Child - 该模式在 Node.js 早期版本、微信小程序基础库 2.0+、React Native 等环境中稳定可用
不推荐用 Object.create(null) 做继承起点
虽然 Object.create(null) 创建的对象没有 toString、hasOwnProperty 等默认方法,看起来“干净”,但它也切断了所有原型链,导致无法被 instanceof 正确识别,也无法被大多数工具(如 JSON.stringify、Lodash 的 isPlainObject)正常处理。
即使你只是想避免污染,也应优先考虑 Object.create(Parent.prototype) 或标准 class 继承。
-
obj instanceof Parent对Object.create(null)实例永远返回false -
for...in遍历时不会报错,但完全遍历不到任何继承方法 - 现代框架(如 Vue 3 的响应式系统)明确要求对象必须有原型链才能代理
class + extends;需要兼容旧环境或特殊控制时,才回到组合继承。别为了“看起来高级”而用 Object.create(null) 或反复重写 __proto__——那只会让调试变慢、协作变难。
# vue
# react
# javascript
# es6
# java
# js
# node.js
# json
# node
# 微信小程序
# 微信
# Object
# NULL
# for
# 父类
# 子类
# 构造函数
# 继承
# class
# 多重继承
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
Laravel distinct去重查询_Laravel Eloquent去重方法
php做exe能调用系统命令吗_执行cmd指令实现方式【详解】
html5如何设置样式_HTML5样式设置方法与CSS应用技巧【教程】
DeepSeek是免费使用的吗 DeepSeek收费模式与Pro版本功能详解
Laravel辅助函数有哪些_Laravel Helpers常用助手函数大全
php在windows下怎么调试_phpwindows环境调试操作说明【操作】
JavaScript数据类型有哪些_如何准确判断一个变量的类型
Laravel Eloquent访问器与修改器是什么_Laravel Accessors & Mutators数据处理技巧
香港服务器网站卡顿?如何解决网络延迟与负载问题?
Laravel如何为API生成Swagger或OpenAPI文档
如何快速搭建个人网站并优化SEO?
香港服务器选型指南:免备案配置与高效建站方案解析
Linux系统运维自动化项目教程_Ansible批量管理实战
进行网站优化必须要坚持的四大原则
教你用AI将一段旋律扩展成一首完整的曲子
如何用狗爹虚拟主机快速搭建网站?
Laravel怎么进行数据库事务处理_Laravel DB Facade事务操作确保数据一致性
Java Adapter 适配器模式(类适配器,对象适配器)优缺点对比
如何在阿里云虚拟服务器快速搭建网站?
如何快速搭建高效WAP手机网站吸引移动用户?
Laravel怎么发送邮件_Laravel Mail类SMTP配置教程
昵图网官网入口 昵图网素材平台官方入口
Claude怎样写结构化提示词_Claude结构化提示词写法【教程】
网页制作模板网站推荐,网页设计海报之类的素材哪里好?
在线制作视频网站免费,都有哪些好的动漫网站?
nginx修改上传文件大小限制的方法
laravel服务容器和依赖注入怎么理解_laravel服务容器与依赖注入解析
Win11怎么关闭专注助手 Win11关闭免打扰模式设置【操作】
如何制作公司的网站链接,公司想做一个网站,一般需要花多少钱?
Laravel Eloquent模型如何创建_Laravel ORM基础之Model创建与使用教程
Laravel如何实现本地化和多语言支持?(i18n教程)
linux写shell需要注意的问题(必看)
长沙做网站要多少钱,长沙国安网络怎么样?
Laravel任务队列怎么用_Laravel Queues异步处理任务提升应用性能
javascript事件捕获机制【深入分析IE和DOM中的事件模型】
Laravel怎么实现支付功能_Laravel集成支付宝微信支付
JavaScript如何操作视频_媒体API怎么控制播放
php 三元运算符实例详细介绍
如何快速生成ASP一键建站模板并优化安全性?
JS经典正则表达式笔试题汇总
Android自定义listview布局实现上拉加载下拉刷新功能
Laravel的路由模型绑定怎么用_Laravel Route Model Binding简化控制器逻辑
利用 Google AI 进行 YouTube 视频 SEO 描述优化
lovemo网页版地址 lovemo官网手机登录
JavaScript如何实现继承_有哪些常用方法
HTML透明颜色代码在Angular里怎么设置_Angular透明颜色使用指南【详解】
html如何与html链接_实现多个HTML页面互相链接【互相】
laravel怎么使用数据库工厂(Factory)生成带有关联模型的数据_laravel Factory生成关联数据方法
php json中文编码为null的解决办法
如何在云服务器上快速搭建个人网站?

