深入探究 JavaScript 中的继承方式

深入探究 JavaScript 中的继承方式

引言

在 JavaScript 的世界里,继承是构建复杂应用程序的重要基石。它允许我们在已有代码的基础上进行扩展和复用,从而提高开发效率。今天,就让我们一同深入探讨 JavaScript 中多种继承方式的奥秘。

在 JavaScript 中,继承的方式多种多样,每种方式都有其独特的优势和适用场景。我们先来看一种常见的方式:原型传递。

function Game (name, type) {this.name = name;this.type = type;
}
Game.prototype.play = function() {console.log(`${this.name} ${this.type} 游戏正在玩`);
}// 现在有一个对象 LOL
function LOL() {}
// 他需要继承 Game 的属性和方法
// 原型传递
LOL.prototype = new Game('LOL', 'MOBA');
LOL.prototype.constructor = LOL;
const lol = new LOL();
lol.play(); // LOL MOBA 游戏正在玩

这种方式简单直接,通过将父类的实例赋给子类的原型,实现了属性和方法的继承。但它也存在一些问题。

重写原型法存在的问题

父类属性一旦赋值给子类的原型属性,此时就属于子类的共享属性,会导致继承者之间实例的篡改。

function Game (name, type) {this.name = name;this.type = type;this.skin = ['史诗'];
}
Game.prototype.play = function() {console.log(`${this.name} ${this.type} 游戏正在玩`);
}// 现在有一个对象 LOL
function LOL() {}
// 他需要继承 Game 的属性和方法
// 原型传递
LOL.prototype = new Game('LOL', 'MOBA');
LOL.prototype.constructor = LOL;
const lol = new LOL();
const lol2 = new LOL();
lol.play(); // LOL MOBA 游戏正在玩
lol2.play(); // LOL MOBA 游戏正在玩
lol.skin.push('至臻');
console.log(lol.skin); // ['史诗', '至臻']
console.log(lol2.skin); // ['史诗', '至臻']

而且在实例化时无法向父类传递参数,即无法创造一个不同的 LOL。

为了解决这些问题,我们引出了构造函数继承(经典继承)。

构造函数继承(经典继承)

通过在子类的构造函数中调用父类的构造函数,解决了实例的独立性。

function Game (name, type) {this.name = name;this.type = type;this.skin = ['史诗'];
}
Game.prototype.play = function() {console.log(`${this.name} ${this.type} 游戏正在玩`);
}
// 现在有一个对象 LOL
function LOL(name, type) {Game.call(this, name, type);
}
const lol = new LOL('LOL', 'MOBA');
const wzry = new LOL('wzry', 'MOBA');
lol.skin.push('至臻');
console.log(lol.skin); // ['史诗', '至臻']
console.log(wzry.skin); // ['史诗']
// 构造函数继承解决了实例的独立性lol.play(); // lol.play is not a function
wzry.play(); // wzry.play is not a function

然而,这种方式又带来了新的问题,即继承了父类的属性和方法,但没有原型传递,无法使用原型共享。

接着,我们来看原型链继承(组合继承)。

原型链继承(组合继承)

结合了原型传递和构造函数继承的优点。

function Game (name, type) {this.name = name;this.type = type;this.skin = ['史诗'];
}
Game.prototype.play = function() {console.log(`${this.name} ${this.type} 游戏正在玩`);
}
// 现在有一个对象 LOL
function LOL(name, type) {// 第一次执行Game.call(this, name, type);
}
// 第二次执行
LOL.prototype = new Game();
const lol = new LOL('LOL', 'MOBA');
const wzry = new LOL('wzry', 'MOBA');
lol.skin.push('至臻');
console.log(lol.skin); // ['史诗', '至臻']
console.log(wzry.skin); // ['史诗']
// 构造函数继承解决了实例的独立性lol.play(); // LOL MOBA 游戏正在玩
wzry.play(); // wzry MOBA 游戏正在玩

但它又存在一个问题,父类的构造函数会被执行两边。

最后,我们介绍寄生组合继承来解决这个问题。

寄生组合继承

通过使用 Object.create() 方法,避免了父类构造函数的重复执行。

function Game (name, type) {this.name = name;this.type = type;this.skin = ['史诗'];
}
Game.prototype.play = function() {console.log(`${this.name} ${this.type} 游戏正在玩`);
}
// 现在有一个对象 LOL
function LOL(name, type) {Game.call(this, name, type);
}
LOL.prototype = Object.create(Game.prototype);
const lol = new LOL('LOL', 'MOBA');
const wzry = new LOL('wzry', 'MOBA');
lol.skin.push('至臻');
console.log(lol.skin); // ['史诗', '至臻']
console.log(wzry.skin); // ['史诗']
// 构造函数继承解决了实例的独立性lol.play(); // LOL MOBA 游戏正在玩
wzry.play(); // wzry MOBA 游戏正在玩

结尾

通过对 JavaScript 中各种继承方式的深入探讨和代码示例,我们可以看到每种方式都有其独特的优势和适用场景。在实际开发中,我们需要根据具体需求选择合适的继承方式,以构建高效、可维护的 JavaScript 应用程序。希望本文能为你在 JavaScript 继承的探索之路上提供有益的参考。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/14297.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

【计算机网络】【网络层】【习题】

计算机网络-传输层-习题 文章目录 13. 图 4-69 给出了距离-向量协议工作过程,表(a)是路由表 R1 初始的路由表,表(b)是相邻路由器 R2 传送来的路由表。请写出 R1 更新后的路由表(c)。…

C/C++精品项目之图床共享云存储(2):MySql连接池

一:介绍 C/C精品项目之图床共享云存储(1) 我们项目的第一个文章讲解了很多的基础组件,包括线程池。我们都知道线程池是为了资源的复用,提高效率。而我们的MySql连接池也是一样的,是为了维持管理固定数量的…

网安数学基础-同余关系

文章目录 参考等价关系实例 同余同余和等价同余的运算 乘法逆元一次同余方程消去律 剩余类中国剩余定理欧拉函数欧拉定理 费马小定理 参考 【一口气学完】密码学的数学基础2,《同余关系》,一小时学完 等价关系 三角形里的全等关系 等价关系定义 下面这…

工业主板市场现状和主要市场驱动因素概述

工业主板市场是计算机硬件行业中的一个重要细分市场,专注于供应专为工业应用而设计的主板。与消费级主板不同,工业主板可承受极端条件,包括高温、连续运行以及暴露在灰尘和潮湿环境中。工业主板对于制造、自动化、医疗、国防和能源等行业中使…

舌尖上的传统美味 —— 食家巷白吉饼

第一眼看到食家巷白吉饼,就被它朴实的外表所吸引。圆润的形状,淡淡的麦色,没有过多的装饰,却散发着一种让人安心的质朴之美。 🎈拿起一个白吉饼,轻轻一掰,“咔” 的一声,那酥脆的外…

OpenHarmony-1.启动流程

OpenHarmony启动流程 1.kernel的启动 流程图如下所示:   OpenHarmony(简称OH)的标准系统的底层系统是linux,所以调用如下代码: linux-5.10/init/main.c: noinline void __ref rest_init(void) {struct task_struct *tsk;int pid;rcu_sch…

ANR分析实例

目录 一、ANR出的问题原因 二、日志分析 2.1 CPU 负载 2.2 内存 2.3 堆栈信息 三、案例分析 3.1 主线程无卡顿,处于正常状态堆栈 3.2 主线程执行耗时操作 3.3 主线程被锁阻塞 3.4 CPU被抢占 3.5 内存紧张导致ANR 3.6 系统服务超时导致ANR 3.7 Input dis…

知识库搭建:高企创新创业的智慧引擎与未来趋势

在当今这个科技迅猛发展的时代,高新技术企业(简称“高企”)作为推动经济社会进步的重要力量,正面临着前所未有的创新挑战与机遇。知识库,这一信息时代的关键工具,不仅汇聚了高企内部的丰富知识与经验&#…

D67【python 接口自动化学习】- python基础之数据库

day67 Python操作MySQL基础使用 学习日期:20241113 学习目标:MySQL数据库-- 136 Python操作MySQL基础使用 学习笔记: pymysql 创建MySQL的数据库链接 执行sql语句 总结 Python中使用第三方库:pymysql来操作MySQL,…

容器管理平台KubeSphere的使用

在之前的课程中我们是在minikube中安装了K8S环境,然后通过kubectl命令来管理K8S的,这种用命令来管理的方式虽然对程序员来说看起来很炫酷,但有时候用起来还是挺麻烦的。这节课程给大家介绍一款企业级容器管理平台KubeSphere,使用它能更方便地管理K8S中的容器,希望对大家有…

低代码可视化-uniapp气泡弹窗组件可视化-代码生成器

气泡弹窗组件是产品设计中常用的控件之一,以下是对uniapp气泡弹窗组件可视化的详细解析: 一、组件定义 气泡弹窗组件(diy-popover )指的是当触发某项操作时,在页面上方或特定位置展示的弹出层容器,容器内…

Unity3D学习FPS游戏(11)敌人AI巡逻(NavMesh)

前言:前面两篇博客已经实现了简单的敌人,但是呢,这样很无趣。因为敌人只会站在原地被攻击,所以本篇我们将实现敌人AI巡逻,让敌人动起来。 敌人AI巡逻 场景丰富一下导航网格NavMesh构建导航网格导航网格优化玩家被当作…

遇到“msvcr120.dll丢失”要怎么解决?详解msvcr120.dll的解决方法

遇到“msvcr120.dll丢失”错误通常表明你的系统缺少一个关键的DLL文件,这是Microsoft Visual C 2013的一部分。这个问题可能导致某些程序无法运行,影响电脑性能。不过,解决这一问题并不复杂。接下来,本文将向你展示几种简单的修复…

git相关知识

前言:在学习git之前首先需要了解几个概念:工作区,暂存区,版本库。 工作区:是电脑上写代码或者文件的目录。 暂存区:一般存放在.git目录下的index中,也称索引。(git add&#xff09…

Spring Boot项目的配置文件有哪些?加载优先级谁最高?配置优先级谁最高?

目录 一. 结论 二. .prperties、.yml、.yaml 文件类型简介及注意点 2.1 文件简介 2.2. .prperties(默认格式/传统格式) 2.3 application.yml(主流格式) 2.4 application.yaml(主流格式) 2.5 配置文件…

蓝牙眼镜WT6900HA语音控制芯片方案:开启智能穿戴新篇章

前言: 随着科技的飞速发展,智能穿戴设备已经逐渐融入我们的日常生活。从智能手表到智能手环,再到如今的智能蓝牙眼镜,这些设备不仅改变了我们的生活方式,更引领了一场科技革命。 今天,我们要为大家介绍一款…

项目管理【02】项目开发完整指南

移动端项目开发完整指南:从需求到上线 在移动应用开发过程中,一个项目从最初的需求到最终上线,需要经过多个关键阶段。本文将详细介绍整个开发流程中的最佳实践,帮助开发团队更高效地完成项目。 一、准备阶段 项目启动前的准备工…

快手直播间采集教程,快手引流,快手截流,截流工具,直播间截流,快手直播间采集,获客系统,获客软件

功能: 1.输入快手直播间链接可一键监控直播间 2.可采集新进直播间的人 3.可采集直播间所有动作,包含:发弹幕的人和内容、送礼物的人和送的礼物、点亮爱心的人 4.可一键导出新进直播间的快手ID 5.可一键导出直播间动作列表,也可以筛…

sol机器人pump机器人如何实现盈利的?什么是Pump 扫链机器人?

什么是Pump 扫链机器人,它的盈利逻辑优化策略是什么? Pump 扫链机器人,通过智能化、自动化的买卖操作帮助投资者实现快速盈利。在此基础上,我们对该机器人的盈利逻辑进行了深度优化,涵盖了买入策略和止盈策略的各个方面…

【vue2】13.自定义指令

目录 自定义指令 自定义指令的作用? 自定义指令的使用步骤? 1. 注册 (全局注册 或 局部注册) 2. 标签上 v-指令名 使用 自定义指令 - 指令的值 1. 通过指令的值相关语法,可以应对更复杂指令封装场景 2. 指令值的语法: 自定义指令 - v-loading…