JS三座大山 —— 原型和原型链

系列文章目录

内容链接
2023前端面试笔记HTML5
2023前端面试笔记CSS3

文章目录

  • 系列文章目录
  • 前言
  • 一、原型是什么?
  • 二、原型链是什么?
    • 2.1 原型链全方面解析
    • 2.2 为什么构造函数也有原型?
  • 总结


前言

理解原型和原型链可以帮助我们更好地理解 JavaScript 中的面向对象编程,实现属性和方法的共享和继承。同时,掌握原型和原型链的知识也是深入学习 JavaScript 的关键。


一、原型是什么?

在 JavaScript 中,每个对象(除了 null 和 undefined)都有一个原型对象(prototype)。原型对象是一个普通的对象,它包含了共享的属性和方法。

现在有1个类A,我想要创建一个类B,这个类B是以类A为原型的,并且能进行扩展。我们称B的原型为A。

  class Student {constructor(name, score) {this.name = name;this.score = score;}introduce() {console.log(`我是${this.name},我考了${this.score}`);}}const student = new Student("张三", 99);

现在有一个Student类,以及它的实例化对象student,当你在student身上使用了它不存在的属性或方法,就会去隐式原型对象__proto__上找
__proto__ =>(指向student实例化对象的原型 => Student类)
在这里插入图片描述

student这个实例化对象身上并没有introduce方法,但是它却能够使用,因为它的隐式原型对象__proto__身上有该方法,__proto__之所以有该方法,是因为它指向的是Student类的原型对象,而原型对象身上有introduce方法
在这里插入图片描述
student实例化对象的隐式原型对象全等于Student类的显示原型对象
在这里插入图片描述

   function person(name, age) {this.name = name;this.age = age;}person.prototype.saying = function () {console.log("你好呀,我是person显示原型对象上的saying函数");};person.prototype.work = "前端开发工程师";const p1 = new person("前端百草阁", 21);

在这里插入图片描述
这里把saying方法挂到了p1的原型身上,我们也可以挂到person构造函数的身上,但是这样就会有一个问题,每次调用构造函数时都会为新的对象创建一个新的方法。如果有多个对象实例,它们将各自拥有自己的方法。这可能会导致内存占用增加,因此在一些情况下,将方法定义在构造函数的原型上更为常见和推荐。

   function person(name, age) {this.name = name;this.age = age;this.saying = function () {console.log("");};}const p1 = new person("前端百草阁", 21);

在这里插入图片描述

在这里插入图片描述

二、原型链是什么?

2.1 原型链全方面解析

就如上图所说,实例自身访问不到的属性或方法,就会往自己的原型身上找(proto
自己的原型找不到就会往原型的原型身上找,直到找到最顶端(Object)

   function person(name, age) {this.name = name;this.age = age;}person.prototype.saying = function () {console.log("你好呀,我是person显示原型对象上的saying函数");};person.prototype.work = "前端开发工程师";const p1 = new person("前端百草阁", 21);

在这里插入图片描述

  class Person {constructor(name) {this.name = name;}drink() {console.log("每个人都会喝水");}}const person = new Person("普通人");class Teacher extends Person {constructor(name, subject) {super(name);this.subject = subject;}teach() {console.log("每个老师都会教书");}}const teacher = new Teacher("哈基米老师", "猫猫课");

在这里的原型链中,如果你对teacher实例化对象使用了drink方法,对象本身是没有drink方法的,但是他可以通过原型链来查找,谁身上具有这个方法,把它拿过来使用
在这里插入图片描述

任何一个人都可以使用hasownproperty方法,因为他是原型链顶端Object身上的方法,所有人都可以访问到
如果指定的属性是对象的直接属性——即使值为 null 或者 undefined,hasOwnProperty() 方法也会返回 true。如果属性是继承的,或者根本没有声明该属性,则该方法返回 false。与 in 运算符不同的是,该方法不会在对象原型链中检查指定的属性。
在这里插入图片描述

这里附上我自己画的原型链继承图,用图看会清晰很多

在这里插入图片描述

Teacher.prototype.__proto__ === Person.prototype // true

2.2 为什么构造函数也有原型?

p1的原型是构造函数,不知道有没有小伙伴和我一样疑惑 对象有自己的原型很正常 为什么构造函数也有自己的原型呢

  • 函数——JavaScript最关键的概念

函数是第一类对象(first-class object),被称为一等公民。函数与对象共存,我们也可以认为函数就是其他任意类的对象。由此可见,对象有的功能,函数也会拥有

函数也是对象,唯一不同的地方在于,函数是可以调用的(invokable),也就是说函数会被调用以便执行某些动作。


总结

综上所述,构造函数通过 prototype 属性指向原型对象,原型对象包含了共享的属性和方法,而对象实例通过原型链(__proto__属性指向原型对象)继承了原型对象的属性和方法。通过 constructor 属性,我们可以追溯到对象实例的构造函数。这些概念共同构成了 JavaScript 中的原型继承机制

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

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

相关文章

传统分拣弊端明显,AI机器视觉赋能物流行业包裹分类产线数智化升级

随着电子商务的快速发展,物流行业的包裹数量持续增长,给物流企业带来了巨大的运营压力。目前,国内大型物流运转中心已开始采用机器视觉自动化设备,但多数快递公司处于半自动化状态,中小型物流分拣中心目前仍靠人工录入…

每日一题——旋转图像

旋转图像 题目链接 方法一:利用辅助数组 通过对示例的观察和分析,我们可以得到这样的结论: 对于原数组的下标为i行元素,顺时针旋转九十度后,都变成了下标为(n-1-i)列元素。如图所示&#xff…

代替forever下一个部署node的持久化工具---pm2

最近有个后端项目,用的是node,在持久化的时候会挂掉,详细了解到用的是nohup,然后先详细了解了一下nohup nohup是一个Linux命令,用于在系统后台不挂断地运行命令,退出终端不会影响程序的运行1nohup的英文全称…

基于RabbitMQ的模拟消息队列需求文档

文章目录 一、项目背景二、需求分析1.核心概念2.BrokerServer核心组件3.核心API4.交换机类型5.持久化6.网络通信7.消息应答 三、消息队列模块划分 一、项目背景 什么是消息队列? 消息队列就是,基于阻塞队列,封装成一个独立的服务器程序&#…

Nginx百科之gzip压缩、黑白名单、防盗链、零拷贝、跨域、双机热备

引言 早期的业务都是基于单体节点部署,由于前期访问流量不大,因此单体结构也可满足需求,但随着业务增长,流量也越来越大,那么最终单台服务器受到的访问压力也会逐步增高。时间一长,单台服务器性能无法跟上业…

three.js渲染带动画的glb文件

1. 准备工作 将下列文件在three.js的包中找到,注意的是我这里使用的是模块化版本的,这里不知道模块化的,可以先去看一下es6的模块化。 控制器: OrbitControls.js 加载器:GLTFLoader.js 材质: RoomEnvironm…

数据时代的必备利器:数据可视化工具的崭新价值

在当今信息时代,数据扮演着越来越重要的角色,而数据的可视化呈现正是一种强大的工具,能够帮助我们更好地理解和利用这些数据。虽然Excel和PPT在处理数据方面有着不可否认的作用,但在处理大规模、复杂数据时,数据可视化…

微信小程序 基于Android的美容理发师预约管理系统

,本系统主要根据管理员、用户及理发师的实际需要,方便用户利用互联网实现对商品信息进行立即订购,同时让管理者可以通过这个系统对用户实际需求以及各信息进行管理。设计该系统主要目的是为了方便用户、理发师可以有一个非常好的平台体验&…

文心一言 VS 讯飞星火 VS chatgpt (84)-- 算法导论8.2 1题

一、用go语言,参照图8-2 的方法,说明 COUNTING-SORT 在数组 A(6,0,2,0,1,3,4,6,1,3,2)上的操作过程。 文心一言: Counti…

现货黄金走势图中的止盈点

对平仓时机的把握能力,是衡量现货黄金投资者水平的重要标志,止盈点设置得是否合理,在行情兑现的时候能否及时地离场,是事关投资者账户浮盈最终能否落袋为安的“头等大事”,要在现货黄金走势图中把握止盈点,…

Linux-安装redis6.2.1及主备复制模式(replication)

Linux-安装redis6.2.1 下载redis6.2.1资源上传至安装目录解压及编译解压修改名称编译 修改配置文件主节点从节点 启动及测试启动主节点从节点 测试 下载redis6.2.1资源 地址》https://redis.io/download/ 上传至安装目录 例:/data/replication/ 解压及编译 解…

【kubernetes系列】Calico原理及配置

概述 Calico是针对容器,虚拟机和基于主机的本机工作负载的开源网络和网络安全解决方案。 Calico支持广泛的平台,包括Kubernetes,OpenShift,Docker EE,OpenStack和裸机服务。 Calico在每个计算节点都利用Linux Kernel实…

DP4863 国产双声道音频功率放大器芯片

产品概述: DP4863 电路是一种双声道桥接音频功率放大器。在 5 V 电源电压下,它能向 4 Ω 负载提供 2.2 W 的输出功率,或向 3 Ω 负载提供 2.5 W的输出功率,THD N 小于 1 %。此外,它还具有耳机输入端,可驱…

《Go 语言第一课》课程学习笔记(十四)

接口 认识接口类型 接口类型是由 type 和 interface 关键字定义的一组方法集合,其中,方法集合唯一确定了这个接口类型所表示的接口。type MyInterface interface {M1(int) errorM2(io.Writer, ...string) }我们在接口类型的方法集合中声明的方法&#…

博士后申请有哪些技巧?

在博士后申请过程中,有一些关键的技巧可以帮助申请者提高成功的机会。以下是知识人网小编的一些建议: 1.精选合适的导师和研究课题:选择与自己研究方向相关且感兴趣的导师和课题非常重要。导师的声誉、研究成果和合作风格都会影响你的博士后经…

智慧工地源码带开发手册文档 app 数据大屏、硬件对接、萤石云

智慧工地解决方案依托计算机技术、物联网、云计算、大数据、人工智能、VR、AR等技术相结合,为工程项目管理提供先进技术手段,构建工地现场智能监控和控制体系,弥补传统方法在监管中的缺陷,最终实现项目对人、机、料、法、环的全方…

黑马程序员上课笔记 P2 JAVA 前置课CMD的使用

引入: 一、人机交互 人机交互的故事: 计算机刚出现的时候的三个特点,占地广 造价高 耗电多 故事: 在计算机的历史中,人机交互(Human-Computer Interaction,简称HCI)一直在不断地…

ExpressLRS开源之RC链路性能测试

ExpressLRS开源之RC链路性能测试 1. 源由2. 分析3. 测试方案4. 测试设计4.1 校准测试4.2 实验室测试4.3 拉距测试4.4 遮挡测试 5. 总结6. 参考资料 1. 源由 基于ExpressLRS开源基本调试验证方法,对RC链路性能进行简单的性能测试。 修改设计总能够满足合理的需求&a…

CA证书颁发机构服务器

目录 一、CA证书颁发机构是什么? 二、数字证书可以干什么? 三、PKI:即公钥加密体系(public key cryptography) 四、CA在网络中的工作流程及原理(以网站为例) 五、HTTPS 的工作原理 六、CA私有证…

xml

1.xml 1.1概述【理解】 万维网联盟(W3C) 万维网联盟(W3C)创建于1994年,又称W3C理事会。1994年10月在麻省理工学院计算机科学实验室成立。 建立者: Tim Berners-Lee (蒂姆伯纳斯李)。 是Web技术领域最具权威和影响力的国际中立性技术标准机构。 到目前为…