JS中的原型和原型链

什么是原型?

JavaScript 是一门基于对象的语言,每个对象都有一个原型(prototype),原型是一个对象或 null 值,它定义了该对象所具有的属性和方法。当读取一个对象的属性或执行一个对象的方法时,如果当前对象本身没有这个属性或方法,那么 JavaScript 就会从该对象的原型中查找这个属性或方法,并递归查找到其原型链上的所有对象,直到找到该属性或方法为止。

在 JavaScript 中,每个函数对象都有一个 prototype 属性,该属性指向该函数的原型对象。当使用 new 操作符创建一个对象时,该对象的原型就被设置为构造函数的 prototype 属性的值。例如:

1

2

3

4

5

6

function Person(name) {

  this.name = name;

}

var person1 = new Person("李三");

// person1 的原型是 Person.prototype

console.log(person1.__proto__ === Person.prototype); // 输出:true

什么是原型链?

JavaScript 的对象之间不是完全独立的关系,它们之间是通过原型链(prototype chain)相互关联的。原型链指的是对象之间的一种继承关系,每个对象都有一个原型对象,而原型对象也可能有自己的原型,这样一直递归下去,就形成了原型链。

当读取一个对象的属性或执行一个对象的方法时,如果该对象本身没有这个属性或方法,JavaScript 就会沿着该对象的原型链向上查找,直到找到该属性或方法为止。如果到达了原型链的顶端还没有找到该属性或方法,则返回 undefined。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

function Person(name) {

  this.name = name;

}

Person.prototype.sayHello = function() {

  console.log(`Hello, my name is ${this.name}`);

};

function Student(name, grade) {

  Person.call(this, name);

  this.grade = grade;

}

// 继承了 Person 的属性和方法

Student.prototype = Object.create(Person.prototype);

// 在 Student.prototype 上添加自己的属性和方法

Student.prototype.study = function() {

  console.log(`${this.name} is studying in grade ${this.grade}`);

};

var student1 = new Student("李三", 3);

student1.sayHello(); // 输出:Hello, my name is 李三

student1.study(); // 输出:李三 is studying in grade 3

在上面的例子中,我们定义了两个构造函数 PersonStudent,并通过 Student.prototype = Object.create(Person.prototype); 实现了 Student 对象继承自 Person 对象的属性和方法。当我们调用 student1.sayHello() 方法时,JavaScript 沿着该对象的原型链向上查找,找到了 Person.prototype 中的 sayHello() 方法。当我们调用 student1.study() 方法时,则直接在 Student.prototype 中查找到了该方法。

总结

通过本文的介绍,我们可以明确 JavaScript 中原型和原型链的概念以及使用方法。理解原型和原型链的设计思想,可以帮助我们更好地理解 JavaScript 的对象模型,从而更好地编写高质量的代码

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

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

相关文章

angualr 的一个请求接口的函数被调用了 但在浏览器控制台看不到调接口

因为您在调用 请求接口的函数如getLocaltion() 方法时没有订阅返回的 Observable,或者在订阅 Observable 时没有正确处理其响应。即要subscribe接口,并正确处理。因为Observables 是惰性执行的。这意味着如果您创建了一个 Observable 对象,但…

软件管理--rpm与yum

文章目录 软件管理--rpm安装软件包:升级软件包:卸载软件包:查询已安装的软件包信息:查询尚未安装但已下载的软件包信息:列出已安装的软件包:列出软件包的文件信息验证软件包完整性导出软件包信息到文件查询…

海康威视运行管理中心 Fastjson RCE

漏洞描述 海康威视运行管理中心系统存在低版本Fastjson远程命令执行漏洞,攻击者可在未鉴权情况下获取服务器权限,且由于存在相关依赖,即使服务器不出网无法远程加载恶意类也可通过本地利用链直接命令执行,从而获取服务器权限。 漏…

华为设备VRP基础

交换机可以隔离冲突域,路由器可以隔离广播域,这两种设备在企业网络中应用越来越广泛。随着越来越多的终端接入到网络中,网络设备的负担也越来越重,这时网络设备可以通过华为专有的VRP系统来提升运行效率。通用路由平台VRP&#xf…

判断上三角矩阵 C语言xdoj491

问题描述 上三角矩阵指主对角线以下的元素都为 0 的矩阵;主对角线为从矩阵的左上角至右下角的连线。 本题要求编写程序,判断一个给定的方阵是否上三角矩阵。 输入格式 第一行给出一个正整数 T,为待测矩阵的个数。接下来给出 T 个矩阵的信息&a…

ES排错命令

GET _cat/indices?v&healthred GET _cat/indices?v&healthyellow GET _cat/indices?v&healthgreen确定哪些索引有问题,多少索引有问题。_cat API 可以通过返回结果告诉我们这一点 查看有问题的分片以及原因。 这与索引列表有关,但是索引…

什么是密钥扩展?如何确保密码安全?

为了访问自己的数字账户,我们通常需要用到密码或口令。不过,正如现实生活中开锁的钥匙可能并不总是牢靠一样,并非所有的密码都是安全的。为了加强在线防御,安全专家开发了一系列技术和方法,来提高密码的安全性。这些方…

用23种设计模式打造一个cocos creator的游戏框架----(二十三)中介者模式

1、模式标准 模式名称:中介者模式 模式分类:行为型 模式意图:用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。 结构图&#xff…

Spring AOP入门指南:轻松掌握面向切面编程的基础知识

面向切面编程 1,AOP简介1.1 什么是AOP?1.2 AOP作用1.3 AOP核心概念 2,AOP入门案例2.1 需求分析2.2 思路分析2.3 环境准备2.4 AOP实现步骤步骤1:添加依赖步骤2:定义接口与实现类步骤3:定义通知类和通知步骤4:定义切入点步骤5:制作切面步骤6:将通知类配给…

1664:【例 2】取石子游戏 2

【题目描述】 有一种有趣的游戏,玩法如下: 玩家: 2 人; 道具: N 堆石子,每堆石子的数量分别为 X1,X2,…,Xn ; 规则: 1、游戏双方轮流取石子; 2、每人每次选一堆石子…

蛋白质测序|蛋白测序-卡梅德生物

蛋白质测序是生物学研究中的一项重要技术,旨在揭示蛋白质的氨基酸序列,从而深入了解其结构和功能。蛋白质作为生物体内细胞结构和功能的主要执行者,对于解析细胞信号传导、代谢调控、细胞周期等生物学过程至关重要。通过蛋白质测序&#xff0…

DPDK单步跟踪(2)-如何编译debug版

第一步是要编译出debug版本的dpdk. 如何下载和编译,这里我不讲了。我们只讲debug https://doc.dpdk.org/guides/prog_guide/build-sdk-meson.htmlsetup meson setup --buildtypedebug debugbuild config meson configure -Dbuildtypedebug 就是这么很简单。 例…

【MYSQL】-数据类型

💖作者:小树苗渴望变成参天大树🎈 🎉作者宣言:认真写好每一篇博客💤 🎊作者gitee:gitee✨ 💞作者专栏:C语言,数据结构初阶,Linux,C 动态规划算法🎄 如 果 你 …

微波射频元件厂商恒利泰授权世强硬创代理,实现滤波器国产替代

据机构数据显示,2018-2022年全球射频元件市场规模从50亿美元增长至150亿美元,平均复合增长率为31.6%,预计到2025年市场规模有望超过302亿美元。其中,滤波器是射频前端各领域产值占比最高的产品。 为扩大产品覆盖率,提…

【密码学】使用mkcert安装CA、自签名ssl证书,配置nginx的https 证书笔记

文章目录 证书(CA证书,服务端证书,客户端证书)1 安装CA1.1 下载mkcert1.2 mkcert安装和配置根证书1.3设备安装根证书 2 自签名ssl证书2.1 CA 证书过程:2.2 自签名流程2.3签发证书2.4给已有的证书请求(.csr)…

C/C++工程中错误码定义总结

本文结合实际经验,参考ros2 rclcpp库中错误码定义及使用方式,梳理了一种基于C或C开发的接口下错误码的定义及处理方式。{本文不涉及跨系统、跨服务的定义} 1.错误码如何定义? 系统一般是按模块划分的,模块与模块之间通过调用与被…

PMP证书的PDU如何获得?

首先,让我们来了解一下PDU的含义。PDU代表专业发展单元(Professional Development Unit),是指在获得认证后,您可以通过学习、授课或提供志愿服务来积累专业项目管理领域的学习时间。PDU以小时为单位计算,每…

idea 远程调试linux上的代码

背景介绍 开发过程中,我们经常会遇到部署的代码运行出问题、看日志由不是很直观、我们希望可以像调试本地代码一样去调试远程代码; IDEA提供了Remote工具,基于JVM的跨平台能力,我们可以远程调试部署的代码。 前提 保证远程和本地跑的代码是一致的 操…

音视频类App广告变现如何破局,最大化广告变现收益,让应用增收?

音视频App已然成为了我们日常获取、发布和交换信息的重要方式,在音视频行业不断的拓展中,用户的渗透率提升。 据数据显示,我国网络视听用户的规模已达9亿人次,网民使用率也突破了90%。庞大的市场规模和用户需求吸引了大批开发者和…

GBASE南大通用数据库提供的高可用负载均衡功能

GBASE南大通用GBase 8a ODBC 提供的高可用负载均衡功能是指,GBase 8a ODBC 会将客户 端请求的数据库集群连接平均分摊到集群所有可用的节点上。 GBASE南大通用数据库负载均衡的使用方法 GBASE南大通用GBase 8a ODBC 提供两种方式来使用高可用负载均衡。一种是配置数…