JS中的原型链与继承

news2024/12/13 17:15:54

文章目录

    • 原型链的类比
    • 原型链
      • 对像与函数拥有的原型属性不同
      • 原型链的产生
      • 对象的constructor属性
      • 继承

原型链的类比

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.coloradmin.cn/o/2258893.html

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

相关文章

Ubuntu22.04搭建FTP服务器保姆级教程

在网络环境中,文件传输是一项至关重要的任务。FTP(文件传输协议)是一种基于客户端/服务器模式的协议,广泛用于在互联网上传输文件。Ubuntu作为一款流行的Linux发行版,因其稳定性和易用性而广受开发者和系统管理员的喜爱…

基于Kubesphere实现微服务的CI/CD——部署微服务项目(三)

目录 一、kubesphere安装 1、安装本地持久存储 1.1、default-storage-class.yaml 1.2、 openebs-operator.yaml 1.3、安装 Default StorageClass 2、安装kubesphere 2.1、安装Helm 2.2、安装kubesphere 二、配置kubesphere 1、安装插件 2、创建devops项目 3、配置…

jenkins harbor安装

Harbor是一个企业级Docker镜像仓库‌。 文章目录 1. 什么是Docker私有仓库2. Docker有哪些私有仓库3. Harbor简介4. Harbor安装 1. 什么是Docker私有仓库 Docker私有仓库是用于存储和管理Docker镜像的私有存储库。Docker默认会有一个公共的仓库Docker Hub,而与Dock…

open cv学习之图片矫正

一,实验原理 图像矫正的原理是透视变换 图像畸变主要有两类:径向畸变和切向畸变。径向畸变通常会导致图像的四个角向外或向内弯曲;切向畸变则是由于相机与图像平面不完全平行引起的。而OpenCV 提供了一个相机标定的工具,能够自动…

【再谈设计模式】组合模式~层次构建的多面手

一、引言 在软件开发的世界里,我们经常面临着处理对象之间复杂关系的挑战。如何有效地表示对象的部分 - 整体层次结构,并且能够以一种统一的方式操作这些对象,是一个值得探讨的问题。组合模式(Composite Pattern)为我们…

关于Git分支合并,跨仓库合并方式

关于Git合并代码的方式说明 文章目录 关于Git合并代码的方式说明前情提要开始合并方式一:git merge方式二:git cherry-pick方式三:git checkout Git跨仓库合并的准备事项前提拉取源仓库代码 前情提要 同仓库不同分支代码的合并可直接往下看文…

Android Freezer

Freezer原理 Android按照优先级将一般的APP从高到低分为: 前台进程 --> 可感知进程–> 服务进程 --> Cached进程。 Freezer通过冻住cached进程,来迫使这些进程让出CPU,以达到优化系统资源使用的目的。 Cached进程是怎么判定的呢? 由于andro…

websocker的java集成过程

第一步&#xff1a;引入依赖包 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-websocket</artifactId> </dependency> 第二步设置配置类&#xff1a; // 需要注入Bean的话必须声明为配置类 Co…

设计模式:24、访问者模式

目录 0、定义 1、访问者模式的五种角色 2、访问者模式的UML类图 3、示例代码 0、定义 表示一个作用于某对象结构中的各个元素的操作。它可以在不改变各个元素的类的前提下&#xff0c;定义作用于这些元素的新操作。 1、访问者模式的五种角色 抽象元素&#xff08;Element…

umi实现动态获取菜单权限

文章目录 前景登录组件编写登录逻辑菜单的时机动态路由页面刷新手动修改地址 前景 不同用户拥有不同的菜单权限&#xff0c;现在我们实现登录动态获取权限菜单。 登录组件编写 //当我们需要使用dva的dispatch函数时&#xff0c;除了通过connect函数包裹组件还可以使用这种方…

Color-Light-Control-and-Four-Way-Responder based on STM32F103C8T6

Light Control and Responder 若要实现同样效果请看源码: gitee.com/apollo_666/Color-Light-Control-and-Four-Way-Responder # Abstract The design project for a decorative lighting controller enhanced our practical skills and engineering capabilities. During our…

数据库中的运算符

1.算术运算符 算术运算符主要用于数学运算&#xff0c;其可以连接运算符前后的两个数值或表达式&#xff0c;对数值或表达式进行加&#xff08;&#xff09;、减&#xff08;-&#xff09;、乘&#xff08;*&#xff09;、除&#xff08;/&#xff09;和取模&#xff08;%&…

python爬虫--小白篇【爬取B站视频】

目录 一、任务分析 二、网页分析 三、任务实现 一、任务分析 将B站视频爬取并保存到本地&#xff0c;经过分析可知可以分为四个步骤&#xff0c;分别是&#xff1a; 爬取视频页的网页源代码&#xff1b;提取视频和音频的播放地址&#xff1b;下载并保存视频和音频&#x…

【计算机网络】实验18:动态主机配置协议DHCP的作用

实验18 动态主机配置协议DHCP的作用 一、实验目的 验证动态主机协议DHCP的作用 二、实验环境 Cisco Packet Tracer模拟器 三、实验过程 1.构建网络拓扑&#xff0c;不给局域网中的各主机手动配置IP地址、子网掩码、默认网关、DNS服务器等信息&#xff0c;而是开启动态主机…

MFC案例:基于对话框的简易阅读器

一、功能目标&#xff1a; 1.阅读txt文件 2.阅读时可以调整字体及字的大小 3.打开曾经阅读过的文件时&#xff0c;能够自动从上次阅读结束的位置开始显示&#xff0c;也就是能够保存和再次使用阅读信息。 4.对于利用剪贴板粘贴来的文字能够存储成txt文件保存。 5.显示…

【开源】基于SpringBoot框架的个性化的旅游网站 (计算机毕业设计)+万字毕业论文 T025

系统合集跳转 源码获取链接 一、系统环境 运行环境: 最好是java jdk 1.8&#xff0c;我们在这个平台上运行的。其他版本理论上也可以。 IDE环境&#xff1a; Eclipse,Myeclipse,IDEA或者Spring Tool Suite都可以 tomcat环境&#xff1a; Tomcat 7.x,8.x,9.x版本均可 操作系统…

谷粒商城—分布式基础

1. 整体介绍 1)安装vagrant 2)安装Centos7 $ vagrant init centos/7 A `Vagrantfile` has been placed in this directory. You are now ready to `vagrant up` your first virtual environment! Please read the comments in the Vagrantfile as well as documentation on…

MySQL概述以及下载安装

MySQL5.7概述以及下载安装&#xff08;centOS7&#xff09; 一、MySQL简介 MySQL是一个典型的关系数据库&#xff0c;目前是Oracle公司产品之一&#xff0c;也是目前主流使用的关系型数据库之一。使用MySQL可以进行最基本的数据存储、管理、查询等操作&#xff0c;也可以方便的…

中粮凤凰里共有产权看房记

中粮凤凰里看房是希望而来&#xff0c;失望而归。主要是对如下失望&#xff0c;下述仅个人看房感受&#xff1a; 1. 户型不喜欢&#xff1a;三房的厨房和餐厅位置很奇葩 2. 样板间在25楼&#xff1a;湖景一言难尽和有工厂噪声 3. 精装修的交房质量:阳台的推拉门用料很草率 …

轮播(css+js)

目录 1.实现效果 2.基础代码演示 2.1js代码 2.1css样式 2.3实现效果 3.实现点击切换 3.1给button添加点击事件 3.2效果图如下 3.3发现问题 3.3.1不循环 3.3.2循环 1.实现效果 2.基础代码演示 2.1js代码 <div class"out-box"><div class"tes…