《深入探秘JavaScript原型链与继承机制:解锁前端编程的核心密码》
在JavaScript的奇妙世界里,原型链与继承机制犹如隐藏的宝藏,掌握它们,就如同拿到了开启高效编程大门的钥匙。对于前端开发者来说,这不仅是写出简洁、可维护代码的关键,更是深入理解JavaScript面向对象编程的基石。今天,就让我们一同揭开它们神秘的面纱。
在JavaScript中,每个对象都像是一个独特的小宇宙,但它们并非孤立存在,而是通过原型链紧密相连。想象一下,每个对象都有一条无形的线索,指向它的原型对象,而这个原型对象又可能指向另一个原型对象,以此类推,形成一条长长的链条,这就是原型链。
当我们创建一个函数时(比如 function Person() {} ),这个函数会自带一个 prototype 属性,它指向一个对象,这个对象就是原型对象。在这个原型对象中,有一个特殊的属性 constructor ,它又会指回创建它的函数。这就像一个闭环,把函数和它的原型对象紧紧联系在一起。当我们使用 new 关键字创建这个函数的实例时(比如 let p = new Person() ),这个实例内部有一个 proto 属性,它就指向了函数的原型对象。这样,实例就可以通过 proto 找到原型对象,从而访问到原型对象上的属性和方法。
当我们访问一个对象的属性或方法时,JavaScript会先在这个对象自身寻找。如果找不到,它就会沿着 proto 这条线索,去它的原型对象中寻找。就好像你在自己家里找一本书,找不到就去隔壁邻居家找。如果在原型对象中还是找不到,就继续沿着原型链向上找,直到找到 Object.prototype 。 Object.prototype 是原型链的顶端,就像这条寻找之旅的终点。如果在 Object.prototype 中都找不到,那就只能返回 undefined ,宣告寻找失败。
例如,我们有一个 Dog 对象,它继承自 Animal 对象。当我们调用 Dog 对象的 speak 方法时,如果 Dog 对象自身没有定义这个方法,JavaScript就会沿着 Dog 的原型链,去 Animal 对象的原型中寻找。如果找到了,就会执行这个方法;如果没找到,就继续往上找,直到 Object.prototype 。
继承机制是JavaScript中实现代码复用的强大工具,它让我们可以基于现有的对象创建新的对象,新对象不仅拥有自己独特的属性和方法,还能继承原有对象的部分特性,就像孩子继承父母的优点一样。
在ES6之前,JavaScript主要通过原型链来实现继承。我们可以通过将子类的原型对象设置为父类的实例,来让子类继承父类的属性和方法。比如,我们有一个 Animal 构造函数,它有一些属性和方法。然后我们创建一个 Dog 构造函数,通过 Dog.prototype = new Animal() ,让 Dog 继承 Animal 。这样, Dog 的实例就可以使用 Animal 的属性和方法了。
但是这种方式有一些缺点,比如所有实例共享同一个原型对象,一个实例对原型对象属性的修改会影响到其他实例。为了解决这个问题,后来又出现了组合继承、寄生式继承、寄生组合式继承等多种继承方式。组合继承结合了原型链继承和构造函数继承的优点,既能继承父类的属性,又能继承父类原型上的方法。寄生式继承则是通过创建一个临时函数,在函数内部创建一个新对象,将父类对象作为新对象的原型,然后返回这个新对象,从而实现继承。寄生组合式继承是寄生式继承和组合继承的结合,它解决了组合继承中父类构造函数被调用两次的问题,是一种比较完美的继承方式。
ES6引入的 class 关键字,让JavaScript的继承变得更加直观和简洁,就像给传统的继承方式披上了一件漂亮的外衣。使用 class 关键字定义类,然后通过 extends 关键字实现继承,这种方式更接近其他传统面向对象编程语言的语法,让开发者更容易理解和使用。比如:
javascript
class Animal {
constructor(name) {
this.name = name;
}
speak() {
console.log(this.name + ’ makes a sound.');
}
}
class Dog extends Animal {
constructor(name, breed) {
super(name);
this.breed = breed;
}
bark() {
console.log(this.name +‘barks.’);
}
}
在这个例子中, Dog 类继承自 Animal 类,它不仅继承了 Animal 类的 name 属性和 speak 方法,还拥有自己独特的 breed 属性和 bark 方法。通过 super 关键字,我们可以调用父类的构造函数和方法,实现对父类属性和方法的复用和扩展。
在前端开发中,我们常常会遇到一些具有共性的功能和属性,比如多个页面都需要的用户登录、数据请求等功能。通过原型链和继承机制,我们可以将这些共性的部分提取出来,放在一个基类或原型对象中,然后让其他对象继承它。这样,不仅减少了代码的重复,还提高了代码的可维护性和可扩展性。当我们需要修改或添加某个共性功能时,只需要在基类或原型对象中进行操作,所有继承它的对象都会自动更新。
在构建复杂的前端应用时,我们经常需要处理各种对象之间的关系,比如游戏开发中的角色系统、电商应用中的商品分类系统等。原型链和继承机制可以帮助我们清晰地定义这些对象之间的层次关系,实现对象的多态性。例如,在一个游戏中,有战士、法师、刺客等不同类型的角色,它们都继承自一个基类 Character ,拥有一些共同的属性和方法,如生命值、攻击力、移动等。同时,每个角色又有自己独特的技能和特点,通过继承和重写基类的方法,我们可以轻松实现这些功能。
合理使用原型链和继承机制还可以优化代码的性能。因为多个对象可以共享原型对象上的属性和方法,而不是每个对象都拥有自己的一份拷贝,这样可以减少内存的占用,提高程序的运行效率。特别是在处理大量相似对象时,这种优势更加明显。
JavaScript的原型链与继承机制是前端开发中非常重要的知识,它们就像一双隐形的翅膀,帮助我们在代码的天空中自由翱翔。通过深入理解和灵活运用它们,我们可以编写出更加高效、优雅、可维护的前端代码。希望这篇文章能帮助你解开原型链与继承机制的奥秘,在前端开发的道路上迈出更加坚实的步伐。
相关文章:
《深入探秘JavaScript原型链与继承机制:解锁前端编程的核心密码》
在JavaScript的奇妙世界里,原型链与继承机制犹如隐藏的宝藏,掌握它们,就如同拿到了开启高效编程大门的钥匙。对于前端开发者来说,这不仅是写出简洁、可维护代码的关键,更是深入理解JavaScript面向对象编程的基石。今天…...
Cursor 生成java测试用例
1. 安装cursor 站点:https://www.cursor.com/cn 安装后登录 2. 使用cursor 2.1 安装扩展: 组合键 CtrlShiftX,进入扩展程序页面,安装如下: Chinese:中文支持, 安装后 CtrlShiftP࿰…...
常见免杀框架的使用(3款)---【AniYaGUI1.2.0、AV_Evasion_Tool掩日、FoxBypass_V1.0】
一、AniYaGUI1.2.0免杀框架 环境:虚拟机Win10 、云服务器 工具:Xshell、CobaltStrike 项目下载地址: https://github.com/piiperxyz/AniYa 1. 安装Go语言环境 确保Win10虚拟机安装 Golang 且环境变量中包含 go 否则⽆法编译(注…...
PHP腾讯云人脸核身生成 SDK 接口调用步骤使用签名
参考腾讯云官方文档: 人脸核身 生成 SDK 接口调用步骤使用签名_腾讯云 前提条件:成功获取NonceTicket。 获取参考文档: PHP腾讯云人脸核身获取NONCE ticket-CSDN博客 function getTxFaceSign(){$appId ;$userId ;$version 1.0.0;$tic…...
LINUX418 加载YUM源 wireshark ping程序 解析
未找到挂载点 未连接 怪不得找不到 计划重启 sr0文件有了 挂载 删除 新建、修改配置文件 清空yum缓存 创建yum缓存 1.检查相关设置:虚拟机两个打钩 2.df -h查看光盘文件 3.挂载在/mnt mount -o ro /dev/sr0 /mnt 4.删除/etc/yum.repos.d 下的文件 5.新建local…...
解决Windows安全中心显示空白页面
1、电脑重装系统后,发现原本一些软件打不开了,电脑莫名认为有病毒,自动删除插件。附图。 2、第一反应是电脑防火墙的原因,默认威胁防护识别到了病毒软件,自动删除。在开始屏幕搜Windows安全中心,打开之后发…...
2.1 SQL server的安装以及一个数据表的创建
Microsoft SQL Server 2014 Express 是一个免费的、功能强大的可靠数据管理系统,为轻型网站和桌面应用程序提供丰富可靠的数据存储. 1. 下载软件并安装 https://www.microsoft.com/zh-cn/download/details.aspx?id42299 勾选SQLEXPRADV_X64_CHS.exe就够了。 可以更…...
楼梯上下检测数据集VOC+YOLO格式5462张2类别
数据集格式:Pascal VOC格式YOLO格式(不包含分割路径的txt文件,仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数):5462 标注数量(xml文件个数):5462 标注数量(txt文件个数):5462 …...
Excel提取图片并自动上传到文件服务器(OOS),获取文件链接
Excel提取图片并自动上传到接口 在实际项目中,我们可能经常会遇到需要批量从Excel文件(.xlsx)中提取图片并上传到特定接口的场景。今天,我就详细介绍一下如何使用Python实现这一功能,本文会手把手教你搭建一个完整的解…...
python有序列表
您的代码整体结构良好,但存在一些关键错误和优化点。以下是对代码的详细评价及改进建议:---### 主要问题1. **add方法中的链表断裂问题**- **问题描述**:当向链表中间插入节点时,未正确设置新节点的next,导致后续节点丢…...
Python(23)Python异常处理完全指南:从防御到调试的工程实践
目录 一、异常处理的核心价值与行业现状二、Python异常体系深度解析2.1 内置异常分类树2.2 七大高频异常处理方案2.2.1 文件操作异常链2.2.2 类型校验防御策略 三、企业级异常处理架构3.1 分布式系统异常封装3.2 上下文管理器资源保护 四、五大核心处理原则1. 精准捕获原则2.…...
LangChain4j-第一篇 |几分钟完成deepseek 在线集成
引言:AI 集成的Hello world 在AI迅猛增长的势头下,作为Java 程序员,也想学习开发AI 的应用产品。好在Java AI 生态也在逐步的完善,我们也可以使用java 语言开发属于自己的应用产品。LangChain4j通过声明式编程模型,将…...
C语言==》字符串断行
示例代码 #include <stdio.h>int main(void) {printf("Heres one way to print a ");printf("long string.\n");printf("Heres another way to print a \ long string.\n");printf("Heres the newest way to print a ""lo…...
springboot全局异常捕获处理
一、需求 实际项目中,经常抛出各种异常,不能直接抛出异常给前端,这样用户体验相当不好,用户看不懂你的Exception,对于一些sql异常,直接抛到页面上也不安全。所以有没有好的办法解决这些问题呢,当然有了&am…...
使用Jasypt对配置文件内容加密
使用Jasypt 配置文件内容加密 一、背景 在软件开发过程中,配置文件扮演着至关重要的角色,它存储着应用程序运行所需的各种参数和设置,例如数据库连接信息、API 密钥、第三方服务的认证信息等。然而,这些配置文件中的信息往往包含…...
opencv函数展示3
一、图像平滑(模糊) 线性滤波(速度快): 1.cv2.blur() 2.cv2.boxFilter() 3.cv2.GaussianBlur() 非线性滤波(速度慢但效果好): 4.cv2.medianBlur() 5.cv2.bilateralFilter() 二、锐…...
linux 4.14内核jffs2文件系统不自动释放空间的bug
前段时间在做spi-nor flash项目的时候,使用jffs2文件系统,发现在4.14内核下存在无法释放空间的bug,后来进行了修复,修复后功能正常,现将修复patch公开,供后来者学习: diff --git a/fs/jffs2/ac…...
华为仓颉智能体开发框架 Cangjie Magic深度解析
华为仓颉智能体开发框架 Cangjie Magic 深度解析 华为仓颉社区推出的 Cangjie Magic 是全球首个基于自研仓颉编程语言原生构建的 LLM Agent(大语言模型智能体) 开发框架,通过三大核心技术突破重构了智能体开发范式,为全场景智能化应用开发提供了全新工具链。以下从核心技术…...
Harmony5.0 设置应用全屏模式,隐藏导航栏和状态栏
Harmony5.0 设置应用全屏模式,隐藏导航栏和状态栏 在应用入口EntryAbility里添加 完整代码如下: import { AbilityConstant, ConfigurationConstant, UIAbility, Want } from @kit.AbilityKit; import { hilog } from @kit.PerformanceAnalysisKit; import { window } fro…...
6. 实战(二):用Spring AI+OpenAI构建企业级智能客服
1、引言 前面几篇已经加深了我们对Spring Ai的体系结构,核心概念,以及也有初步集成实现了一个简单demo。今天,我们通过使用Spring AI框架与OpenAI API集成,构建一个功能完善的智能对话系统,加深我们对Spring AI从概念…...
线上健身预约小程序源码介绍
基于ThinkPHPFastAdminUniApp开发的一款线上健身预约小程序源码,其主要功能包括搜索教练、课程、门店,以及轻松预约健身项目。 用户只需通过指尖轻点,即可快速查找并预约心仪的健身课程,无需繁琐的线下操作步骤。此外,…...
掌握MySQL:基本查询指令与技巧
🍑个人主页:Jupiter. 🚀 所属专栏:MySQL初阶学习笔记 欢迎大家点赞收藏评论😊 目录 表的增删查改1 CreateInsert1.1 单行数据 全列插入指定列插入1.2 多行数据插入 指定列插入1.3 插入否则更新 1.4 替换 2 Retrieve …...
本地生活服务信息分类信息系统
最近在找分类信息系统,看了很多市面上常见的分类信息系统: 1,私集分类信息系统 2,火鸟分类信息系统 3,觅分类信息系统 4,框分类信息系统 5,蚂蚁分类信息系统 发现很多分类信息系统,…...
视频编解码种类/技术/区别/优缺点汇总
视频编解码种类/技术/区别/优缺点汇总 按国家/机构划分的全球主要视频编码标准 (含优缺点)视频编解码涉及到的主要技术及通俗解释主流视频编码标准的实现方式 按国家/机构划分的全球主要视频编码标准 (含优缺点) 组织/国家分类标准名称 (常用名/别名)推出年份 (约)主要制定组织…...
【专题刷题】双指针(四):最接近的三数之和,接雨水
📝前言说明: 本专栏主要记录本人的基础算法学习以及LeetCode刷题记录,按专题划分每题主要记录:(1)本人解法 本人屎山代码;(2)优质解法 优质代码;ÿ…...
星露谷物语 7000+ 大型MOD整合包
衣服美化、家具美化、地图美化、人物肖像美化 全地图装修存档、人物美化、扩展包、环境美化、家具、动植物、通用前置包、新增NPC、功能、服装发饰妆 帽子发型农场小镇美化大型玩法拓展实用功能mod 动漫人物形象MOD 地点/动物/地图/功能/机械/家具/建筑/界面美化/扩展/农场/食谱…...
Vue自定义指令-防抖节流
Vue2版本 // 防抖 // <el-button v-debounce"[reset,click,300]" ></el-button> // <el-button v-debounce"[reset]" ></el-button> Vue.directive(debounce, { inserted: function (el, binding) { let [fn, event "cl…...
几款开源C#插件框架
有几个优秀的开源C#插件框架可供选择,它们提供了更完善的功能和更好的扩展性。以下是几个主流的开源C#插件框架: 1. MEF (Managed Extensibility Framework) 官方库:System.ComponentModel.Composition 特点: .NET官方提供的插件系统 基于特性(Attribute)的声明式组件注册…...
PHP使用pandoc把markdown文件转为word
文章目录 首先安装pandocPHP处理 服务器操作系统是Linux,centos 首先安装pandoc yum install -y pandoc安装完成后输入如下代码,检查安装是否成功 pandoc --versionPHP处理 我把markdown内容存到了数据库里,所以要从数据库读取内容。对内容…...
Vmware esxi 查看硬盘健康状况
起因 硬盘掉盘 - - 使用自带的命令esxcli 列出所有硬盘 esxcli storage core device list[rootlocalhost:~] esxcli storage core device list t10.NVMe____INTEL_MEMPEK1W016GAL____________________PHBT83660BYP016D____00000001Display Name: Local NVMe Disk (t10.NVMe…...
vue3中ref创建的变量使用`.value`(可以使用volar插件自动添加`.value)
1.安装volar插件 2.打开>设置 >扩展...
Docker中镜像、容器、仓库三者之间的关系
镜像: 定义: 镜像只是一个静态的、只读的模板,包括了创建容器所需的文件系统、依赖库、和配置。类似于操作系统之中的安装光盘或虚拟机的磁盘镜像。 特点和作用 特点: 分层存储:镜像由多个只读层(Layer)叠加而成,每一层代表一…...
【刷题Day19】HTTP的各个版本(浅)
HTTP 1.0 和 2.0 有什么区别? HTTP/1.0 版本主要增加以下几点: 增加了HEAD、POST等新方法。增加了响应状态码。引入了头部,即请求头和响应头在请求中加入了HTTP版本号引入了Content-Type,使得传输的数据不再限于文本。 HTTP/1.…...
浅析StringBuilder和StringBuffer的区别和联系?
区别 1. 线程安全性 StringBuilder:是非线程安全的。这意味着在多线程环境下,如果多个线程同时访问并修改同一个 StringBuilder 对象,可能会导致数据不一致或其他并发问题。不过,由于不需要考虑线程安全的额外开销,它…...
【数据融合实战手册·实战篇】二维赋能三维的5种高阶玩法:手把手教你用Mapmost打造智慧城市标杆案例
在当今数字化时代,二三维数据融合技术的重要性不言而喻。二三维数据融合通过整合二维数据的结构化优势与三维数据的直观性,打破了传统数据在表达和分析上的局限,为各行业提供了更全面、精准的数据分析手段。从智慧城市建设到工业智能制造&…...
Linux 系统编程 day5 进程管道
进程间通信(IPC) Linux环境下,进程地址空间相互独立,任何一个进程的全局变量在另一个进程中都看不到,所以进程和进程之间不能互相访问,要交换数据必须通过内核,在内核中开辟一块缓冲区…...
【项目管理】第19章 配置与变更管理-- 知识点整理
项目管理-相关文档,希望互相学习,共同进步 风123456789~-CSDN博客 (一)知识总览 项目管理知识域 知识点: (项目管理概论、立项管理、十大知识域、配置与变更管理、绩效域) 对应:第6章-第19章 第6章 项目管理概论 4分第13章 项目资源管理 3-4分第7章 项目…...
C语言---FILE结构体
一、FILE 结构体的本质与定义 基本概念 FILE 是 C 语言标准库中用于封装文件操作的结构体类型,定义于 <stdio.h> 中。它代表一个“文件流”,可以是磁盘文件、标准输入输出(stdin/stdout/stderr)或其他输入输出设备。 实现特…...
C# 高级编程:Lambda 表达式
在 C# 的高级编程中,Lambda 表达式是一个强大而灵活的工具,广泛应用于 LINQ 查询、委托、事件处理以及函数式编程等多个领域。它不仅使代码更简洁、表达更直接,而且在某些场景中能极大提高代码的可读性与可维护性。本文将从 Lambda 表达式的基本语法入手,深入探讨其原理、常…...
【Python语言基础】22、异常处理
文章目录 1. 异常1.1 简介1.2 为什么需要异常处理 2. 基本语法2.1 各部分详解 3. 异常处理流程3.1 执行try代码块3.2 异常发生检查3.3 异常捕获与匹配3.4 执行匹配的 except 代码块3.5 执行 else 代码块(可选)3.6 执行 finally 代码块(可选&a…...
7、生命周期:魔法的呼吸节奏——React 19 新版钩子
一、魔法呼吸的本质 "每个组件都是活体魔法生物,呼吸节奏贯穿其生命始终,"邓布利多的冥想盆中浮现三维相位图,"React 19的呼吸式钩子,让组件能量流转如尼可勒梅的炼金术!" ——以霍格沃茨魔法生理…...
Echart 地图放大缩小
在 ECharts 中,可以通过设置地图的 roam 属性以及相关事件监听来实现地图的放大、缩小功能。以下是实现地图放大缩小的常用方法: 1. 开启 roam 属性 roam 是 ECharts 地图组件中的一个重要属性,用于控制地图是否支持平移和缩放操作。 roam:…...
Django ORM 定义模型
提示:定义模型字段的类型 文章目录 一、字段类型二、字段属性三、元信息 一、字段类型 常用字段 字段名描述备注AutoFieldint 自增必填参数 primary_keyTrue,无该字段时,django自动创建一个 BigAutoField,一个model不能有两个Au…...
Linux和Ubuntu的驱动适配情况
旧 一、Linux Yocto3.0 二、Ubuntu 1.驱动 1.rtc正常 2.led正常 3.加密芯片正常 4.硬件看门狗不行,驱动已经适配好,等硬件修复后,直接使用脚本就可以 5.千兆网口可以,两个百兆网口不行 6.USB上面和下面都可以(插u盘…...
JavaScript 性能优化实战
一、代码执行效率优化 1. 减少全局变量的使用 全局变量在 JavaScript 中会挂载在全局对象(浏览器环境下是window,Node.js 环境下是global)上,频繁访问全局变量会增加作用域链的查找时间。 // 反例:使用全局变量 var globalVar = example; function someFunction() {con…...
b站PC网页版视频播放页油猴小插件制作
文章目录 前言需求分析实施观察页面起始渲染编码效果展示 总结 前言 新手上路,欢迎指导 需求分析 想要一个简约干净的界面,需要去除推荐栏和广告部分. 想要自由调节视频播放速率,需要在视频控制栏加一个输入框控制视频倍速 实施 观察页面起始渲染 因为要使用MutationObse…...
C#获取当前方法的命名空间、类名称、方法名称以及方法的参数信息
C#获取当前方法的命名空间、类名称、方法名称以及方法的参数信息 输出示例模块示例 输出示例 获取信息:WindowsFormsApp1.Form1.button1_Click(System.Object sender,System.EventArgs e) 引发的异常:“System.IndexOutOfRangeException”(位于 WindowsFormsApp1.ex…...
git常用的命令
最近使用git进行团队开发遇到的一些分支的问题需要使用各种命令,整理一下方便日后使用 1.常用的Git命令 1.初始化仓库 git init //创建一个新的Git仓库2. 克隆仓库 git clone <repository-url> //克隆远程仓库到本地。3.查看当前的状态 git status …...
大语言模型的训练、微调及压缩技术
The rock can talk — not interesting. The rock can read — that’s interesting. (石头能说话,不稀奇。稀奇的是石头能读懂。) ----硅谷知名创业孵化器 YC 的总裁 Gar Tan 目录 1. 什么是大语言模型? 2. 语言建模ÿ…...
制作一个简单的操作系统2
Linux 一般都提供了需要的标准工具。使用nasm汇编器,gcc编写自己的os 开发环境截图: 创建一个文件,让 BIOS 将文件识别为一个可引导的磁盘 理论基础 计算机上电启动后,首先运行主板 BIOS 程序, BIOS 并不知道如何加载操作系统,所以 BIOS 把加载操作系统的任务交给引导…...