原型对象、实例、原型链的联系

const F = function () { this.name = 'Jack' }   // ƒ () { this.name = 'Jack' }const e = new F()  // F { name: "Jack" }console.log(e.name)  // Jack

构造函数:现在 F 就是构造函数。任何一个函数被 new 使用后,就是构造函数,没被 new 使用过就是普通函数。(简单说 new 后面的函数都是构造函数)

实例对象:现在 e 就叫做实例,在 js 中,只要是被 new 出来的对象都叫做实例对象,也叫实例。(所以说实例都是对象,但是对象就不一定是实例了)

原型对象:现在 F.prototype 就是原型对象,任何一个函数都有 prototype 属性,这个属性是声明函数时 js 自动加的,prototype 初始时是一个空对象,这个对象就叫原型对象。

他们之间的关系就如同下图:

从图中可得知4种关系:

1、构造函数(例子中的 F)new 出来的东西就叫实例;

2、构造函数(例子中的 F)的 prototype 属性就叫原型对象;

3、原型对象(F.prototype)中的 constructor 其实就等于构造函数,可以打印一下   F.prototype.constructor === F  // true;

4、实例(例子中的 e)的 __proto__ 属性其实就是构造函数(F)的 prototype 可以打印  e.__proto__ === F.prototype  // true。

这个时候我们就知道原型对象就是用来区分它是哪个构造函数引用的,而且如果多个实例中的方法相同,我们就可以把方法写在 prototype 原型对象中,prototype 属性是可以被多个实例共有,想要你就new一下。

__proro__ 是任何对象都有的属性,而在 js 中,万物皆对象。所以会形成一条 __proro__ 连起来的链条,递归访问 __proto__ 最终到头,并且值是 null,这个过程从头到结束就叫原型链。或者说要查一个实例对象中的值时,首先通过本身的 __proto__ 属性找到他的原型对象,然后再通过他的原型对象的 __proto__ 找到他的原型对象,一直找,递归访问 __proto__ 最终到头,并且值是null,这个过程从头到结束就叫原型链。找到了就返回值,找不到就返回 undefind。

还有一个比较重要的,不止构造函数有 __proto__ 属性,普通函数也有,因为普通函数是Function的实例。

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

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

相关文章

JVM之本地方法栈和程序计数器和堆

本地方法栈 本地方法栈是为虚拟机执行本地方法时提供服务的 JNI:Java Native Interface,通过使用 Java 本地接口程序,可以确保代码在不同的平台上方便移植 不需要进行 GC,与虚拟机栈类似,也是线程私有的,…

计算机网络(六)应用层

应用层 基本概念 服务器端(Server): 服务器是网络中提供服务的计算机或软件程序。服务器通常具有更高的性能、更大的存储空间和更高的带宽,用于提供各种服务,如文件存储、数据库管理、Web托管、电子邮件传递等。服务…

Qt对象池,单例模式,对象池可以存储其他类的对象指针

代码描述: 写了一个类,命名为对象池(ObjectPool ),里面放个map容器。 3个功能:添加对象,删除对象,查找对象 该类只构建一次,故采用单例模式功能描述:对象池可…

【Redis 神秘大陆】008 常见Java客户端

八、Redis 的 Java 客户端 8.1 Jedis 连接池 单点连接池 Jedis 连接池基于 Common-Pool 连接池里面放置的是空闲连接,如果被使用 (borrow)掉,连接池就会少一个连接,连接使用完后进行放回 (return&#…

UbuntuServer22.04安装docker

通过ubuntuserver安装docker是搭建开发环境最便捷的方式之一。下面介绍一下再ubuntu22.04上如何安装docker。相关内容参考官网链接:Install Docker Engine on Ubuntu 根据官网推荐,利用apt命令的方式安装,首先需要设置docker仓库&#xff0c…

ES源码二:集群启动过程

命令行参数解析 Elasticsearch:在main里面创建了Elasticsearch实例,然后调用了main方法,这个main方法最终会调用到父类Command的main方法 这里做了几件事: 注册一个 ShutdownHook,其作用就是在系统关闭的时候捕获IO…

目标检测算法——YOLOV9——算法详解

一、主要贡献 深度网络输入数据在逐层进行特征提取和空间变换时,会丢失大量的信息。针对 信息丢失问题,研究问题如下: 1)从可逆功能的角度对现有深度神经网络架构进行了理论分析,解释了许多过去难以解释的现象&#xf…

【网络编程】如何创建一个自己的并发服务器?

hello !大家好呀! 欢迎大家来到我的网络编程系列之如何创建一个自己的并发服务器,在这篇文章中,你将会学习到在Linux内核中如何创建一个自己的并发服务器,并且我会给出源码进行剖析,以及手绘UML图来帮助大家…

3D目标检测实用技巧(三)- 生成虚拟点

一、引言 本次参考的是VirConv生成虚拟点的方法: VirConv/tools/PENet at master hailanyi/VirConv GitHubVirtual Sparse Convolution for Multimodal 3D Object Detection - VirConv/tools/PENet at master hailanyi/VirConvhttps://github.com/hailanyi/Vir…

手写spring IOC底层源码来模拟spring如何利用多级缓存解决循环依赖的问题

在文章开始之前,先来看一张spring IOC加载过程的脑图吧 Spring IOC的加载过程 首先,当我们去new了一个applicationContext,它底层呢就会把我们配置的bean进行扫描,然后创建成一个一个的beanDefinition放在我们的beanDefinitionMap中,此时就有了一切创造bean的原料信…

计算机网络:MAC地址 IP地址 ARP协议

计算机网络:MAC地址 & IP地址 & ARP协议 MAC地址IP地址ARP协议 MAC地址 如果两台主机通过一条链路通信,它们不需要使用地址就可以通信,因为连接在信道上的主机只有他们两个。换句话说,使用点对点信道的数据链路层不需要使…

宝剑锋从磨砺出,透视雀巢咖啡品牌焕新与产品升级的想象力

自1989年进入中国市场以来,陪伴着国内咖啡行业由启蒙期走向兴盛期的雀巢咖啡,始终坚持以消费者高品质、个性化需求为本位,在保有独特性的基础上持续创新,实现了从无到有的攻克与突破。 近日,深耕中国三十六载的雀巢咖…