2023年了要怎么理解原型和原型链

news2024/11/24 11:04:47

1.prototype和__proto__有什么不可告人的关系?

说道原型对象,那一定绕不开几个概念:
prototype,__proto__,constructor。

首先解释一下prototype是什么,原型对象。V8引擎给所有函数内置的一个对象。也就是只要创建的了一个函数(类也算,因为类的本质也是函数)。那么这个函数就会携带一个原型对象prototype。

再来说一下__proto__,不管是函数还是对象,都具有__proto__这个属性。现在,我来带给你一个非常牛逼的万能公式,来说明__proto__和prototype之间的关系

不管函数还是对象的__proto__,一定等价于对应实例化的类的原型对象。

201504141249489350_c_w_600.jpg

什么意思,我现在举个例子:

function People(name){
  this.name = name
}
let p1 = new People();

let arr = new Array();
let obj = new Object();

现在我有三个对戏,p1(通过People类实例化出来的),arr(通过Array类实例化出来的),obj(通过Object类实例化出来的)。

那么我可以说:

p1.__proto__ === People.prototype;
arr.__proto__ === Array.prototype;
obj.__proto__ === Object.prototype;

那有人就会说了,你这不全面。不只是对象才有__proto__属性啊;函数的__proto__怎么算呢?

OK,对于上面的People类来说,如果我换一种写法!!!!!如下:

let People = new Function('name','this.name = name')

是不是一下就通透了,就完美。完全可以说People是通过Function类实例化出来的,所以!!!

People.__proto__ === Function.prototype;
Array.__proto__ === Function.prototype;
Object.__proto__ === Function.prototype;

除了实例化对象和函数,是否还有其他的什么东西具有__proto__属性呢?

还有一个特例,就是prototype。我们知道原型对象是创建函数的时候,V8给带出来的,但我们管它是谁带出来的呢?原型对象原型对象,原型对象还是对象,是对象就是Object实例化出来的,所以:

People.prototype.__proto__ === Object.prototype

如果推到这里,你就会发现,如果Object.prototype也指向Object的原型对象。那么原型链就没头了,所以:

Object.prototype.__proto__ === null

现在,对于原型链和原型对象,是不是非常通透。赶紧去控制台试试,记住上面最重要的公式:

不管函数还是对象的__proto__,一定等价于对应实例化的类的原型对象!!!

2.constructor又在这里面搞什么飞机

对于constructor,和prototype,__proto__之间的关系。并不能像上面那样找到一个比较明确的公式。

u=162216898,2553278571&fm=253&fmt=auto&app=138&f=JPEG.webp
所以,这里我们针对于不同情况下,列出不同事物的constructor和事物的prototype或者__proto__之间的对应关系。反正也不多,就简单记一下好了。

(1)对象的constructor:

对象的constructor等价于,对应实例化类的本身:
[].constructor === Array

(2)函数的constructor:

函数的constructor等价于,Function:
Array.constructor === Function

(3)prototype的constructor

prototype的constructor等价于,对应函数的本身:
Array.prototype.constructor === Array

(4)__proto__的constructor

__proto__的constructor等价于,对应实例化类的本身:
[].__proto__.constructor === Array

对于上面的公式,可别来一个数学上的等价关系奥。比如由第一条和第四条,你来一个交换律:
[] === [].__proto__
这可不兴交换奥,只能说明二者共用了一个constructor,并不能说明二者是一个东西奥。

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

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

相关文章

瑞丽-伯纳德对流的拉格朗日拟序结构(FTLE场结果对比)

FTLE场,即有限李雅普诺夫指数场是识别拉格朗日拟序结构的一种方法,其主要思路是如下: 1、t时刻在场内均匀布置粒子 2、计算t–>tT时刻后粒子的位置,这里粒子任意时刻的速度有速度场插值得到 3、根据两个时刻的粒子位置计算得…

资讯 |智汇云舟受邀出席WGDC大会并获“年度最具创新力企业“奖项

5月17日,由泰伯网主办的第十二届WGDC2023全球地理信息开发者大会在北京隆重召开。开幕式上重磅发布了“2023年度最具创新力”榜单,智汇云舟凭借技术创新研发与应用方面取得的诸多突破,获数字孪生赛道“年度最具创新力企业"奖项。公司产品…

Django高级扩展之Paginator分页实现

在项目中很常见的一种功能,主要用于大量数据在一页显示过于冗长,分为一页显示多条数据,分隔为多页显示;并常与条件筛选结合使用。 目录 Paginator对象 创建对象 属性 方法 异常 Page对象 创建对象 属性 方法 Paginator与…

华为OD机试之阿里巴巴找黄金宝箱(I)

阿里巴巴找黄金宝箱(I) 题目描述 一贫如洗的樵夫阿里巴巴在去砍柴的路上,无意中发现了强盗集团的藏宝地,藏宝地有编号从0~N的箱子,每个箱子上面贴有一个数字,箱子中可能有一个黄金宝箱。 黄金宝箱满足排在它之前的所有箱子数字…

Kubernetes Pod 生命周期

Pod 生命周期是其从创建开始至终止退出的事件范围。 Pod 状态 Pending API server 创建了 Pod 对象并已存入 etcd 中,但尚未调度完成或仍处于从镜像仓库下载镜像的过程中。Running Pod 已经被调度至某节点,并且所有容器都已经被 kubelet 创建完成。Suc…

spss分析方法-聚类分析

聚类分析是根据研究对象的特征,按照一定标准对研究对象进行分类的一种分析方法。下面我们主要从下面四个方面来解说: 实际应用理论思想建立模型 分析结果 一、实际应用 聚类分析的目标就是在相似的基础上收集数据来分类。 聚类源于很多领域&#xf…

安装虚幻引擎

1、下载和安装 Epic Games启动程序。 下载地址:https://www.unrealengine.com/zh-CN/download 进入网站你可以看到下载信息和推荐系统要求等: 点击“下载启动程序”即可下载,或者直接点击下载链接:https://epicgames-download1.ak…

37岁985硕士,投上千份简历无人问津......该何去何从

前言 简单自我介绍一下,我老刘,37岁失业的985硕士 ,13年其实可以直接入编的我,其实都不需要考试了,可以直接入职,但是我并没有选择去,后面直接选择了新闻周刊干了四年,后面换了一家…

【福利】不用考试可以增持CSPM-2证书?有PMP证书才行!

2021年10月,中共中央、国务院发布的《国家标准化发展纲要》明确提出构建多层次从业人员培养培训体系,开展专业人才培养培训和国家质量基础设施综合教育。建立健全人才的职业能力评价和激励机制。由中国标准化协会(CAS)组织开展的项…

CSS查缺补漏之《过渡效果与动画效果》

过渡 过渡效果使用transition属性表示&#xff0c;设置在需要过渡效果的元素上&#xff0c;它可以在让元素从一种样式平滑过渡为另一种样式。下面会依次介绍其属性值~ 示例代码如下&#xff1a; <div class"box">世界你好 </div> .box {width: 200px…

多态下,为什么使用virtual修饰析构函数

多态下,为什么使用virtual修饰析构函数 问题&#xff1a; 用virtual修饰的析构函数和非虚函数的析构函数有什么区别&#xff1f; 当时以为&#xff1a;只有经过virtual修饰的析构函数&#xff0c;派生类生命周期结束时&#xff0c;才会自动的先调用派生类的析构函数&#xff0…

mybatisplus连接sqlserver配置

目录 前言&#xff1a; 一&#xff1a;所需依赖&#xff1a; 二&#xff1a;application.yml 三:分页插件 前言&#xff1a; 本文主要讲解连接sqlserver的配置 一&#xff1a;所需依赖&#xff1a; <?xml version"1.0" encoding"UTF-8"?> &l…

hutool工具包的实用方法简单介绍

说明&#xff1a;Hutool是一个小而全的Java工具类库&#xff08;详细参考&#xff1a;https://hutool.cn/docs/#/&#xff09;&#xff0c;使用前需要先添加依赖 &#xff08;添加依赖&#xff09; <dependency><groupId>cn.hutool</groupId><artifactId…

Redis从入门到精通进阶篇之持久化RDB

文章目录 RDB持久化工作原理 Redis 6的持久化机制主要有两种&#xff1a;RDB&#xff08;Redis DataBase&#xff09;和AOF&#xff08;Append Only File&#xff09;。本文将详细介绍这两种持久化方式的工作原理和配置要点。 RDB持久化 RDB持久化是将当前进程的数据生成快照…

项目经理,35岁以后就很难再有竞争力了吗?

早上好&#xff0c;我是老原。 知乎热榜上有一个问题吸引了我的注意&#xff1a; 说句公道话&#xff0c;35岁确实是个坎&#xff0c;这个坎在吃青春饭的行业来说&#xff0c;格外明显。 体力和精力都大不如年轻人&#xff0c;从性价比的角度来说&#xff0c;公司还是不会用…

2.2ORBSLAM3之几种特征点提取方法

0.简介 本节对ORB特征、SIFT特征、SURF特征、Harris角点、Shi-Tomas角点的提取与描述子计算原理进行总结&#xff0c;其中Harris角点、Shi-Tomas角点是关键点&#xff0c;没有对应的描述子&#xff0c;一般用于光流跟踪(Vins系列算法)。 综合所有的特征检测算法来看&#xff…

win设置静态IP

win设置静态IP地址 前言 局域网&#xff0c;IP地址的管理方式主要有静态分配方式和动态分配方式。 静态分配IP地址是指给每一台计算机都分配一个固定的IP地址&#xff0c;优点是便于管理&#xff0c;特别是在根据IP地址限制网络流量的局域网中&#xff0c;以固定的IP地址或IP地…

Django高级扩展之tinymce富文本实现

目录 安装 在站点中使用 注册富文本应用 添加配置文件 创建模型类 生成迁移文件 执行表迁移 配置站点 富文本不显示解决 修改主题 修改语言设置 自定义视图使用 设置路由 视图 创建模板 总结 安装 pip install django-tinymce 安装过程如下&#xff1a; 在站点…

宾军志:数据管理能力成熟度模型建设历程

4月27日在2023数据治理新实践峰会上&#xff0c;中国电子信息行业联合会数据资产管理专委会秘书长宾军志先生为大家分享了《数据管理能力成熟度模型建设历程》主题演讲。 以下为宾军志先生的演讲实录&#xff0c;为了方便阅读&#xff0c;小编做了一些字句修改和文本优化。大家…

JDK安装2023最完整教程与配置(零基础)

一、JDK简介 学习Java&#xff0c;需要下载并安装JDK&#xff0c;即Java Development Kit、Java开发工具包&#xff0c;为了能够打开java程序&#xff0c;就需要按照操作系统的要求进行环境变量的配置。 二、JDK下载 要想运行java开发的程序&#xff0c;必须先下载jdk&#…