1. 继承的概念与基础实现继承是面向对象编程中最重要的特性之一。在HTML和前端开发领域虽然我们主要使用标记语言但通过JavaScript的类继承机制我们依然可以实现强大的代码复用和层次结构设计。继承的核心思想是子类可以获取父类的属性和方法同时还能扩展自己的特性。这就像现实世界中的遗传——孩子会继承父母的特征同时又有自己的独特性。1.1 原型链继承JavaScript中最基础的继承方式是通过原型链实现的。每个构造函数都有一个prototype属性指向原型对象实例通过__proto__访问这个原型。function Parent() { this.name parent; } Parent.prototype.sayName function() { console.log(this.name); }; function Child() { this.childName child; } // 关键继承步骤 Child.prototype new Parent(); const child new Child(); child.sayName(); // 输出parent这种方式的缺点是所有子类实例共享同一个父类实例无法向父类构造函数传参无法实现多继承1.2 构造函数继承为了解决原型链继承的问题我们可以使用构造函数继承也称借用构造函数function Parent(name) { this.name name; this.colors [red, blue]; } function Child(name) { Parent.call(this, name); // 关键继承步骤 } const child1 new Child(child1); child1.colors.push(green); const child2 new Child(child2); console.log(child1.colors); // [red, blue, green] console.log(child2.colors); // [red, blue]这种方式解决了引用类型共享和传参问题但无法继承父类原型上的方法。2. 组合继承与优化方案2.1 组合继承经典继承组合继承结合了原型链和构造函数继承的优点function Parent(name) { this.name name; this.colors [red, blue]; } Parent.prototype.sayName function() { console.log(this.name); }; function Child(name, age) { Parent.call(this, name); // 第二次调用Parent this.age age; } Child.prototype new Parent(); // 第一次调用Parent Child.prototype.constructor Child; const child new Child(Tom, 10);这种模式的问题在于父类构造函数会被调用两次导致子类原型上存在不必要的属性。2.2 寄生组合式继承这是目前最理想的继承方式function inheritPrototype(child, parent) { const prototype Object.create(parent.prototype); prototype.constructor child; child.prototype prototype; } function Parent(name) { this.name name; } Parent.prototype.sayName function() { console.log(this.name); }; function Child(name, age) { Parent.call(this, name); this.age age; } inheritPrototype(Child, Parent); const child new Child(Jerry, 8);这种方式只调用一次父类构造函数避免了在子类原型上创建不必要的属性同时保持原型链不变。3. ES6类继承ES6引入了class语法糖使继承更加直观class Parent { constructor(name) { this.name name; } sayName() { console.log(this.name); } } class Child extends Parent { constructor(name, age) { super(name); // 必须调用super this.age age; } sayAge() { console.log(this.age); } } const child new Child(Lucy, 12);ES6类继承的特点使用extends关键字明确继承关系子类构造函数中必须调用super()支持静态方法继承底层实现仍然是基于原型链4. 继承的进阶应用与注意事项4.1 多继承的实现JavaScript本身不支持多继承但可以通过混入(Mixin)模式模拟class A { methodA() { console.log(A); } } class B { methodB() { console.log(B); } } class C { constructor() { Object.assign(this, new A()); Object.assign(this, new B()); } } const c new C(); c.methodA(); // A c.methodB(); // B4.2 继承中的方法重写子类可以重写父类方法同时通过super保留对父类方法的访问class Parent { greet() { return Hello from Parent; } } class Child extends Parent { greet() { return super.greet() and Hello from Child; } } console.log(new Child().greet()); // Hello from Parent and Hello from Child4.3 继承与性能考量深度继承链会影响性能因为属性查找需要遍历整个原型链。建议保持继承层次扁平最好不超过3层对于频繁访问的属性考虑直接定义在实例上使用组合代替继承来共享行为5. 实际项目中的继承实践5.1 UI组件继承案例在前端框架中继承常用于创建基础组件class BaseComponent { constructor(element) { this.element element; } show() { this.element.style.display block; } hide() { this.element.style.display none; } } class Modal extends BaseComponent { constructor(element) { super(element); this.element.classList.add(modal); } open() { this.show(); // 添加模态框特有逻辑 } }5.2 表单验证继承体系构建可扩展的表单验证系统class Validator { constructor(rules) { this.rules rules; } validate(value) { for (const rule of this.rules) { if (!rule.test(value)) { return false; } } return true; } } class EmailValidator extends Validator { constructor() { super([ { test: v v.includes() }, { test: v v.length 5 } ]); } validate(value) { const isValid super.validate(value); if (!isValid) { console.error(Invalid email format); } return isValid; } }5.3 继承与组合的选择在项目中何时使用继承何时使用组合使用继承当存在明显的是一个关系需要完全继承父类行为子类是父类的特殊化使用组合当只需要部分功能复用可能存在多个行为来源关系更符合有一个而非是一个6. 常见问题与解决方案6.1 原型链断裂问题错误示例Child.prototype Parent.prototype; // 错误这会导致修改子类原型会影响父类原型。正确做法是使用Object.create()创建新对象。6.2 忘记调用super()在ES6类继承中如果子类有constructor必须调用super()class Child extends Parent { constructor() { // 忘记super()会导致错误 this.name child; // ReferenceError } }6.3 静态方法继承ES6类支持静态方法继承class Parent { static staticMethod() { return static; } } class Child extends Parent {} Child.staticMethod(); // static6.4 私有字段继承ES2022引入的私有字段(#前缀)不能被继承class Parent { #privateField 42; getPrivate() { return this.#privateField; } } class Child extends Parent { tryGet() { return this.#privateField; // SyntaxError } }7. 继承的最佳实践优先使用组合而非继承组合更灵活耦合度更低保持继承层次扁平深度继承链难以维护避免重写具体方法重写抽象方法是可以的使用Liskov替换原则子类应该能够替换父类考虑使用工厂函数有时比类继承更简单合理使用mixin模式实现多行为组合文档化继承关系明确说明为什么使用继承在大型前端项目中我通常会创建一个基础的BaseComponent类然后通过组合和少量继承来构建组件体系。对于业务逻辑更倾向于使用组合和服务注入的方式来实现复用。
企业数字化 ERP 产品动态
相关推荐
BPSK匹配滤波器设计与实现:RRC成形配对与工程避坑 简介:本资源是一份面向通信工程专业本科生及数字信号处理初学者的MATLAB仿真实验包,聚焦BPSK调制系统中匹配滤波与根升余弦脉冲成形的核心原理验证。资源通过完整闭环仿真,帮助学习者理解发送端根升余弦成形、加性高斯白噪声信道建模、接收端… · 2026/11/3 1:20:58
P10单元板连级驱动实战:HUB12接口、1/4扫描与STM32代码详解 简介:这份资源面向LED显示屏开发初学者与嵌入式工程师,聚焦P10单元板的点阵显示与连级驱动实现,帮助读者理解1632点阵的像素排布、驱动IC数据接口以及多板串联时的同步与时序控制逻辑。压缩包内共1个文件,为C语言源码,… · 2026/11/3 1:34:05
多台servers管理实战:架构、配置、部署与监控 1. 从一台到一千台:为什么“servers”这个词值得单独拎出来聊“servers”这个词,乍一看平平无奇,就是“服务器”的复数形式。但如果你真正在生产环境里摸爬滚打过几年,就会明白这个词背后藏着的坑,比单台服务器多出不止… · 2026/11/3 6:58:38
ps需要什么电工证良心建议:实操考试心里没底怕挂科?实操细节全公开 ps需要什么电工证良心建议:实操考试心里没底怕挂科?实操细节全公开 实操考试心里没底怕挂科?很多想考电工证的学员在报名前都会有这种想法,尤其是像PS这类对电工技能有实际需求的岗位,很多人不清楚自己到底需要考哪种电工证,考试流程又是怎样的,担… · 2026/11/9 13:05:22
高配电工证指什么多少钱?工地太忙根本没时间复习考试 高配电工证指什么多少钱?工地太忙根本没时间复习考试 工地太忙根本没时间复习考试,你是不是也经常一边赶工期一边在手机上翻资料?高配电工证指什么,多少钱,这些信息你得先搞清楚,不然真要耽误事。别急,我结合濮阳项目现场管理的实战经验,告诉你怎么高… · 2026/11/9 13:05:22
电工证复审年龄要求你知道多少?实操考试心里没底怕挂科 电工证复审年龄要求你知道多少?实操考试心里没底怕挂科 实操考试心里没底怕挂科,是大多数特种作业人员的真实写照。尤其是电工证复审年龄要求,很多人担心年龄大了会影响考试通过率,甚至影响到官方报名入口的申请资格。其实,只要掌握好关键点,合理规划备… · 2026/11/9 13:05:22
电工证技术职称怎么写怎么报名才能快速上岗找工作 电工证技术职称怎么写怎么报名才能快速上岗找工作 你还在为找不到电工工作发愁?手头没证,面试连门都进不了!很多电工从业者都遇到过这样的问题: 电工证技术职称怎么写… · 2026/11/9 13:05:22
渭南哪里考电工证官方报名入口在哪 渭南哪里考电工证官方报名入口在哪 学历不高怕报不上名?别慌,渭南电工证考试其实门槛没你想的那么高。只要你符合基本条件,就能顺利报名参加考试。现在就带你搞清楚【渭南哪里考电工证】的官方报名入口,以及考试流程、备考重点、实操内容和薪资情况,别再… · 2026/11/9 13:05:22
宜昌那可以考电工证电子证书怎么查和转过来 宜昌那可以考电工证电子证书怎么查和转过来 之前考的证在外省能不能转过来?这个问题其实很多人都遇到过,尤其是像你这样在宜昌工作的朋友,可能之前在外地考的电工证,现在想在当地继续使用,但不知道流程和细节。其实,现在有了 电子证书… · 2026/11/9 13:04:22
电工证丢失还能补吗?千万别踩坑,丢了证等于失业 电工证丢失还能补吗?千万别踩坑,丢了证等于失业 你正在找工作,但手里的电工证突然丢了,这下怎么办?别急,先别慌, 电工证丢失还能补吗 ?答案是肯定的,但 千万别踩坑 ,补办流程如果不了解,可能会耽误你上岗、甚至影响到你的收入。… · 2026/11/9 2:05:04
电力电缆作业证直播报名入口与办理流程良心建议 电力电缆作业证直播报名入口与办理流程良心建议 你是不是也担心学历不高报不了名?别急,今天就给你讲讲 电力电缆作业证直播 的报名流程和那些你必须知道的干货, 良心建议 在这里,别错过。 电力电缆作业证直播报名需要什么条件?… · 2026/11/9 3:11:26
英德电工证报考费多少钱,怕考不过白交培训费?看完这篇别再踩坑 英德电工证报考费多少钱,怕考不过白交培训费?看完这篇别再踩坑 怕考不过白交培训费?英德电工证报考费多少钱,你真的了解吗?现在市面上培训机构五花八门,价格参差不齐,很多人一不小心就花了冤枉钱,结果还考不过。别急,今天就来给你说清楚英德电工证的… · 2026/11/9 5:24:17
电工证不需要考复审延期怎么办理 通过率揭秘 电工证不需要考复审延期怎么办理 通过率揭秘 不知道去哪报名怕被中介坑?电工证不需要考复审延期怎么办理?最近不少学员都在问这个问题,尤其是刚拿到证的新手,对复审流程一知半解,生怕被培训机构套路。别担心,今天咱们就来聊聊电工证复审的真相,尤其是… · 2026/11/9 0:00:54
砀山哪里考电工证的多 电工证报考别踩坑 郑州报考避坑指南 砀山哪里考电工证的多 电工证报考别踩坑 郑州报考避坑指南 工地太忙根本没时间复习考试,这几乎是所有一线施工人员的共同心声。尤其是像电工这样的特种作业,操作证不仅关系到能不能上工,还直接关系到工资高低和职业发展。可偏偏,很多人连怎么报名、去哪… · 2026/11/9 0:00:54
南方电网电工作业含金量高吗?应届生怎么考怎么干? 南方电网电工作业含金量高吗?应届生怎么考怎么干? 工地太忙根本没时间复习考试,这不是个别现象,而是很多刚毕业的工程类学生面临的现实。南方电网电工作业的证书,听起来门槛不低,但 含金量… · 2026/11/9 0:00:54
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/9 11:23:35
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/9 11:23:58
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/9 11:25:08