原型链详解

news/2024/11/18 1:44:21/

什么是原型链

原型链就是顺着__proto__所在的一条链子,这样说可能不是很好理解,下面来看例子你就会理解。

需要了解

1.a.__proto__a.prototype都称做为a的原型。
2.Object.prototype是原型链的顶端。
3.如果 a是由b实例化出来的,则有关系a.__proto__ === b.prototype,所以a.__proto__的地址和b.prototype指向的地址是一样的,即他们使用的是同一个对象。

原型链解读

先以函数实例的原型链为例子为大家讲解

function A(){}
const a=new A()
console.log(a.__proto__===A.prototype)   // true,这里是根据上面 '需要了解'处可以推断
console.log(A.prototype.__proto__===Object.prototype)   
// true,这里可以通过打印 A ,然后展开看到 A 就能看到该关系

知道以上关系后,可以得出原型链如下:
在这里插入图片描述
再以数组的原型链为例

const arr=[]
console.log(arr.__proto__===Array.prototype)  //true,根据上面 '需要了解'处可以推断
console.log(Array.prototype.__proto__===Object.prototype)  
// true,打印 Array,然后展开Array就能看到该关系

知道以上关系后,可以得出原型链如下:
在这里插入图片描述
其它的原型链如:函数、对象、正则、日期的原型链和上面的基本一致。

原型链的作用

首先你需要只知道的是,处在原型上的对象,是可以顺着自己所在原型链向上找,然后可以使用上面的方法或者属性。主要作用就是减少内存消耗,提高代码的复用率。看看下面示例你就会明白

function A(){}
A.prototype.f1=()=>{console.log('f1')}
A.prototype.f2=()=>{console.log('f2')}
A.prototype.f3=()=>{console.log('f3')}const a1=new A()
const a2=new A()
const a3=new A()a1.f1()  // f1
a2.f1()  // f1
a3.f1()  // f1

把一些公共的方法添加到原型上,这样我们实例化的每个对象就都可以使用这些这些原型上的方法了。如果我们不把方法添加到原型上,而现在需求是需要每个实例都能使用上面的这些方法,那我们只能将这些方法都添加到实例上例:a1.f1=f1。如果我们把这些方法添加到原型上,实例使用时,只需要往原型上找就行,而且所有实例使用的同一个原型。对比一看,是不是省了很多内存开销。

合理使用原型

手动在原型上添加某个属性

Object.prototype.a=2

这是第三方库a.js含有如下代码

Object.prototype.a=1

此时引入a.js

const obj={}
console.log(obj.a)   // 1 

此时不是我们期望的结果,所以不要滥用原型,不要在系统的原型上随意添加修改方法

原型的读写相关方法

const user={name:"nb",age:18}//获取user对象的 __proto__
Object.getPrototypeOf(user) 
// 把user对象的原型修改为{},修改对象的__proto__,只能修改为对象
Object.setPrototypeOf(user,{}) 

原型为什么不能修改为非对象

const obj={}
obj.__proto__=1
console.log(obj.__proto__)  //打印后依然是一个对象
/*
<get __proto__()>: function __proto__()
<set __proto__()>: function __proto__()
*/

在打印的对象中可以找到 __proto__ 属性被劫持了,这就是原因。

结尾

看完这篇文章后,你会发现原型链用来是这么的简单。感谢你们的观看,希望这篇文章能给你带来帮助。如果有小伙伴有问题或者疑惑,欢迎提出和分享。


http://www.ppmy.cn/news/484817.html

相关文章

(二)原型和原型链

文章目录 一、原型和原型链1.构造函数2.为什么要一个原型对象&#xff1f;3.两个属性&#xff1a;prototype与__proto__4.原型链 二、new和Object.create的区别1.Object.create的使用2.二者区别 一、原型和原型链 在接触原型与原型链中&#xff0c;我产生了以下几个疑问&#…

最详尽的 JS 原型、js原型链终极详解(第二篇)

四. proto JS 在创建对象&#xff08;不论是普通对象还是函数对象&#xff09;的时候&#xff0c;都有一个叫做__proto__ 的内置属性&#xff0c;用于指向创建它的构造函数的原型对象。 对象 person1 有一个 __proto__属性&#xff0c;创建它的构造函数是 Person&#xff0c;构…

原型及原型链详解

&#xff08;首先先大致的介绍一下什么是原型与原型链及相关术语&#xff0c;以便初学者有个大概的了解&#xff09; 原型&#xff1a;被用于复制现有实例来生成新实例的函数 &#xff08;这里补充一个设计模式为原型模式&#xff0c;即用原型实例指定创建对象的种类&#xff…

产品思维的核心要素

产品思维的关键词 如果说用几个关键词来总结 “产品思维” &#xff0c;我会用以下几个关键词来概括它&#xff0c;分别是&#xff1a;"4高"、"1深"、"3广" &#xff0c;具体怎么理解&#xff0c;我们接下来一个一个的说。 4高 先来看一看 4高…

elasticsearch 创建索引模版template

添加索引代码如下&#xff1a; PUT _template/redsmg-chandemo {"order" : 2,"index_patterns" : ["redsmg-chandemo_*"],"mappings" : {"doc" : {"dynamic_templates" : [{"string_as_num" : {"…

献给蓝初小白系列(二)——Liunx应急响应

1、Linux被入侵的症状​​ ​​https://blog.csdn.net/weixin_52351575/article/details/131221720​​ 2、Linux应急措施 顺序是&#xff1a;隔离主机--->阻断通信--->清除病毒--->可疑用户--->启动项和服务--->文件与后门--->杀毒、重装系统、恢复数据 …

高效项目评审的6大注意事项

评审活动是软件项目降低风险的重要手段&#xff0c;但在实际评审活动中往往因主题不明确、现场争执不停&#xff0c;主持人无法有效控制会议流程等问题&#xff0c;最终导致项目评审活动效果大打折扣。 那么在项目评审过程中有什么注意事项&#xff0c;有助于完成高效的评审会议…

Linux【系统学习】(命令及虚拟机篇-无shell)

目录 第 1 章 Linux 入门 1.1 概述 1.2 Linux 和 Windows 区别 ​编辑 1.3 CentOS 下载地址 第 2 章 VM 与 Linux 的安装 2.1 VMWare 安装 CentOS 安装 第 3 章 Linux 文件与目录结构 3.1 Linux 文件 3.2 Linux 目录结构 第 4 章 VI/VIM 编辑器&#xff08;重要&…