javascript如何实现继承_有哪些方法可以创建子类【教程】

发布时间 - 2026-01-28 00:00:00    点击率:
JavaScript中class继承必须用extends和super(),子类需显式继承单个父类并在构造函数中先调用super()再访问this;多重继承不支持,漏调或错序super()会抛ReferenceError。

JavaScript 中 class 继承必须用 extendssup

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) 创建的对象没有 toStringhasOwnProperty 等默认方法,看起来“干净”,但它也切断了所有原型链,导致无法被 instanceof 正确识别,也无法被大多数工具(如 JSON.stringify、Lodash 的 isPlainObject)正常处理。

即使你只是想避免污染,也应优先考虑 Object.create(Parent.prototype) 或标准 class 继承。

  • obj instanceof ParentObject.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的解决办法  如何在云服务器上快速搭建个人网站?