JS中的原型链与继承

原型链的类比

JS中原型链,本质上就是对象之间的关系,通过protoype[[Prototype]]属性建立起来的连接。这种链条是动态的,可以随时变更。

这个就跟C/C++中通过指针建立的关系很相似,比如,通过指针建立一个链表,一个个地址就是通过指针串连起来,产生关系。指针指向变化,就是决定了链表的形态。

JS中原型链最大的作用就是模拟继承,达到代码复用的目的。

MDN上的这篇文章对JS中原型链和继承介绍的很详细

https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Inheritance_and_the_prototype_chain

但是读起来比较枯燥,尝试将总结下,加强理解。

原型链

对像与函数拥有的原型属性不同

尽管JS一切皆对象,但还是可以把对象细分下:

  1. 普通对象,包括自定义对象和内建对象(非new操作符创建的对象)。
  2. new操作符创建的对象。
  3. 函数。

为什么这么分,因为它们所拥有的原型的属性有所不同。

如下代码,定义一个函数Person,用它创建一个对象person

function Person() {}let person = new Person();

函数Person和对象person它们所包含的原型属性不同。

  • 函数Person

`

函数Person中包含prototype[[Prototype]](__prototype__)属性,普通函数也是如此。

  • 对象person

对象person中只包含[[Prototype]](__prototype__)属性,普通对象也是如此。

每个函数都一个prototype[[Prototype]](__prototype__)属性,对象没有prototype,只有[[Prototype]](__prototype__)属性。

原型链的产生

通过new操作符,使对象和函数间产生了连接。这条链接就是原型链,它们通过原型属性 prototype[[Prototype]]的指向产生链接。

上面的代码中,函数Person和对象person通过new操作符产生了链接,如下关系图:

  • person__proto__属性指向了Personprototype属性所指的对象,这个对象就是Person的原型对象。
console.log(person.__proto__ == Person.prototype) //打印true
  • Person的原型对象(属性prototype的指向)是Person prototype,它也只有__proto__属性,它指向了Object的原型对象(属性prototype的指向)Object prototype
console.log(Person.prototype.__proto__ == Object.prototype) //打印true
  • Person属性__proto__指向Function的原型对象(属性prototype的指向)Function prototype
console.log(Person.__proto__ == Function.prototype) //打印true
  • Object对象的原型对象(属性prototype的指向)的__proto__对象指向null

对象的constructor属性

每个对象中都有constructor属性,表示由谁创建。普通对象的constructor属性指向Object

new操作符创建的对象,constructor属性指向new操作符调用的函数,称为对象的构造函数。

可以看看上面的图,画出了constructor属性的指向。

继承

原型链将各个对象链接在一起,但试图访问对象的属性时,不仅在该对象上查找属性,还会在该对象的原型上查找属性,以及原型的原型,依此类推,直到找个一个名字匹配的属性或到达原型链的末尾。这就很像,在链表中查找值,一个一个的节点查找,直到末尾。

如下代码,通过原型建立继承:

// 构造函数
function Box(value) {this.value = value;
}// 使用 Box() 构造函数创建的所有盒子都将具有的属性
Box.prototype.getValue = function () {return this.value;
};const boxes = [new Box(1), new Box(2), new Box(3)];

这种写法也很像为指针赋值,Box.prototype.getVale() = ... ,改变Box原型对象的内容,以达到代码复用的目的。

对我这样c++的程序员来说,这种形式的继承实现,感觉非常奇怪。它也叫继承,但是与java,c++中继承大相径庭,在c++中继承是语法层面,静态特性。

JS这种实现,以我C++的角度看来更像是"链表"模拟继承。它的原型属性的指向可以随时变更,constructor属性也可以随时变更。也就是原来的继承体系,可以任意更改。

这样的方式,只能说是写代码的约定(约定通过原型实现继承),而不像c++中是语法层面的强约束。

在es6中继承的写法得到了改观,虽然只是个语法糖,本质没变,但是在写代码层,让人更容易理解,如下代码也是实现继承:

class Base {}
class Derived extends Base {}const obj = new Derived();
// obj ---> Derived.prototype ---> Base.prototype ---> Object.prototype ---> null

Derived继承Base,写法上不再去显示操作原型属性,这样也增强了约定的约束力。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数据结构——图(遍历,最小生成树,最短路径)

目录 一.图的基本概念 二.图的存储结构 1.邻接矩阵 2.邻接表 三.图的遍历 1.图的广度优先遍历 2.图的深度优先遍历 四.最小生成树 1.Kruskal算法 2.Prim算法 五.最短路径 1.单源最短路径--Dijkstra算法 2.单源最短路径--Bellman-Ford算法 3.多源最短路径--Floyd-…

华为云云日志服务 HarmonyOS NEXT采集最佳实践

鸿蒙背景介绍 华为鸿蒙HarmonyOS系统是面向万物互联的全场景分布式操作系统,支持手机、平板、智能穿戴、智慧屏等多种终端设备运行,提供应用开发、设备开发的一站式服务的平台。2024 年 1 月 18 日正式推出 HarmonyOS NEXT 鸿蒙星河开发者预览&#xff…

在Ubuntu上使用IntelliJ IDEA:开启你的Java开发之旅!

你好,年轻的学徒!🧑‍💻 是时候踏上进入Java开发世界的史诗之旅了,我们的得力助手将是强大的IntelliJ IDEA。准备好了吗?出发吧! 在我们开始之前,我们需要下载这个工具。但是&#…

图片预处理技术介绍4——降噪

图片预处理 大家好,我是阿赵。   这一篇将两种基础的降噪算法。   之前介绍过均值模糊和高斯模糊。如果从降噪的角度来说,模糊算法也算是降噪的一类,所以之前介绍的两种模糊可以称呼为均值降噪和高斯降噪。不过模糊算法对原来的图像特征的…

基础算法--双指针

两数之和 点击:题目链接 解法一:暴力解法 时间复杂度:O(N^2) 算法思路:两层for循环即可列出所有两个数字的组合,判断是否等于目标值 算法流程: 两层 for 循环: 外层 for 循环依次枚举第⼀个…

WPF+LibVLC开发播放器-音量控制和倍速控制

界面 界面上增加音量的控件和倍速控制控件 音量控制 主要也是一个Slider进度条控件来实现音量调节 我们这里设置默认的最大值为100,默认Value值也为100,默认声音开到最大 这里目前完全由前端控制音量调节,可以直接使用ValueChanged事件实…

【C语言练习(3) —水仙花数判断】

系列文章目录 文章目录 系列文章目录前言题目解题思路结果总结与反思 前言 通过水仙花数巩固之前学习知识点,锻炼自己的写敲代码能力,只有写才能发现问题、找问题、解决问题 题目 求出所有5位数中的所有水仙花数(Lily Number)&a…

【专题】2024年11月新能源汽车、智能汽车行业报告汇总PDF洞察(附原数据表)

原文链接:https://tecdat.cn/?p38520 随着科技的飞速发展与社会的持续变革,新能源汽车与智能汽车行业正步入全新的发展阶段,成为全球瞩目的焦点领域。本报告深入且全面地剖析了 2024 年 11 月该行业的多方面状况。从汽车消费市场来看&#…

【C++图论 BFS算法】2467. 树上最大得分和路径|2053

本文涉及知识点 C图论 CBFS算法 LeetCode2467. 树上最大得分和路径 一个 n 个节点的无向树,节点编号为 0 到 n - 1 ,树的根结点是 0 号节点。给你一个长度为 n - 1 的二维整数数组 edges ,其中 edges[i] [ai, bi] ,表示节点 a…

Mysql | 尚硅谷 | 第02章_MySQL环境搭建

Mysql笔记:第02章_MySQL环境搭建 说明:本内容整理自尚硅谷B站MySQL视频>>尚硅谷B站MySQL视频 文章目录 Mysql笔记:第02章_MySQL环境搭建第02章_MySQL环境搭建 1. MySQL的卸载步骤1:停止MySQL服务步骤2:[软件](h…

【网络篇】TCP知识

TCP首部格式? 为什么需要 TCP 协议? TCP 工作在哪一层? IP 层是不可靠的,它不保证网络包的交付、不保证网络包的按序交付也不保证网络包中的数据的完整性。如果需要保障网络数据包的可靠性,那么就需要由上层&#xff0…

Spring Boot漫画之家:漫画爱好者的数字图书馆

2 系统开发环境 2.1 JAVA简介 JavaScript是一种网络脚本语言,广泛运用于web应用开发,可以用来添加网页的格式动态效果,该语言不用进行预编译就直接运行,可以直接嵌入HTML语言中,写成js语言,便于结构的分离&…

一次“okhttp访问间隔60秒,提示unexpected end of stream“的问题排查过程

一、现象 okhttp调用某个服务,如果第二次访问间隔上一次访问时间超过60s,返回错误:"unexpected end of stream"。 二、最终定位原因: 空闲连接如果超过60秒,服务端会主动关闭连接。此时客户端恰巧访问了这…

一、开启 GD32 单片机的学习之门

文章目录 一、开启GD32单片机的学习之门二、筑牢根基:GD32单片机基础知识全解析(一)单片机概述 三、开发环境搭建(一)软件下载与安装(二)安装GD32F450设备支持包(三)编译…

渗透测试---burpsuite(6)暴力破解与验证码识别绕过

声明:学习素材来自b站up【泷羽Sec】,侵删,若阅读过程中有相关方面的不足,还请指正,本文只做相关技术分享,切莫从事违法等相关行为,本人与泷羽sec团队一律不承担一切后果 视频地址:泷羽---bp&…

PSHuman 部署笔记

目录 github地址: 依赖项: xformers安装: 解决方法,安装xformers smpl_data下载: 推理步骤: SMPLDataset 香港科技大学提出了一种叫PSHuman的新框架。这个方法利用了一个多视角扩散模型的“先验知识…

基于VTX356语音识别合成芯片的智能语音交互闹钟方案

一、方案概述 本方案旨在利用VTX356语音识别合成芯片强大的语音处理能力,结合蓝牙功能、APP或小程序,打造一款功能全面且智能化程度高的闹钟产品。除了基本的时钟显示和闹钟提醒功能外,还拥有正计时、倒计时、日程安排、重要日提醒以及番茄钟…

20241206-Windows 10下使用IDEA 2024.2.3(JDK 18.0.2.1)搭建Hadoop 3.3.6开发环境

Windows 10下使用IDEA 2024.2.3(JDK 18.0.2.1)搭建Hadoop 3.3.6开发环境 1. 配置好本地hadoop之后 2. idea 新建或导入 Maven 项目 3. 编写 pom.xml 文件: 有些版本和项目信息需要根据自己的项目进行调整 JDK 18.0.2.1 Hadoop 3.3.6 <?xml version"1.0" encod…

如何使用WinCC DataMonitor基于Web发布浏览Excel报表文档

本文介绍使用 WinCC DataMonitor 的 "Excel Workbooks" 功能&#xff0c;通过 Excel 表格显示 WinCC 项目的过程值、归档变量值和报警归档消息。并可以通过 Web 发布浏览访问数据 1&#xff0e;WinCC DataMonitor是什么 ? DataMonitor 是 SIMATIC WinCC 工厂智能中…

Fastadmin地图插件在表单中的使用

表单中实现地图选择获取经纬度 1.Fastadmin后台安装地图选择插件地图位置(经纬度)选择插件 - 支持百度地图、高德地图、腾讯地图 – 基于ThinkPHP和Bootstrap的极速后台开发框架 2.腾讯地图开放平台后台创建应用创建KEY&#xff0c;配置逆地址解析额度。插件配置中配置腾讯地图…