JavaScript基础系列之原型链

news2024/9/24 23:27:56

1. 前言

今天的重点复习的是JavaScript原型链。所谓是"基础不牢,地动山摇",原型链作为继承等相关知识的基础,就显得尤为重要了。接下来以手绘原型链为基础,详解讲解下原型链以及相关的属性

原型链

2. 原型 以及原型链

2.1 prototype

  • 其实函数在被创建时,会存在两个内容。一个是函数本身,另一个是函数.prototype. 可以理解为函数天生就是双胞胎
    prototye实例图
  • 每个函数上都会存在一个属性prototype,这个属性指向函数.prototype
  • 函数.prototype上存在属性constructor,该属性指向函数本身
    代码实例图
function User() {}

console.log(User.prototype.constructor === User); // true

2.2 __proto__

  • 每个实例都会存在属性**__proto__, 实例.__proto__** 会指向函数的原型对象
    prototye实例图

2.2.1 特例:

  • 具体构造函数.__proto__ === Function.prototype。停停停!!! 不是只有实例上才有属性**__proto__** 吗,为什么函数也可以调用呢?
    • 是因为具体的构造函数也是 Function 的实例
function Person() {}
const person = new Person();

// 实例.__proto__ 指向构造函数.prototype
console.log(person.__proto__ === Person.prototype); // true
console.log(person.__proto__ === Object.getPrototypeOf(person)); // true

// 特例:具体函数.__proto__ 指向了Function.prototype
console.log(Person.__proto__ === Function.prototype); // true

// 特例:函数本身.__proto__ === 指向了Function.prototype
console.log(Function.__proto__ === Function.prototype); // true

2.3 constructor

  • 原型对象 prototype 存在属性constructor, 该属性指向构造函数本身

constructor指向

function Person() {}
const person = new Person();

// 原型对象上存在属性<constructor> 指向
console.log(Person === Person.prototype.constructor);

// 实例的构造函数
console.log(person.constructor);
// person本身没有constructor属性
console.log(Object.prototype.hasOwnProperty.call(person, "constructor")); // false
// 其实是通过原型继承来的
console.log("constructor" in person); // true

2.4 实例以及原型

实例是通过属性__proto__一直向上寻找属性,先是实例自己属性 => 原型属性 => 父类实例属性 => 父类原型属性… 以此类推

function User() {
  this.name = "xxx1";
}

const u = new User();
console.log(u.name); // xxx1

function User1() {}

User1.prototype.name = "xxx2";
const u1 = new User1();
console.log(u1.name); // xxx2

function User2() {}
// User2.prototype.name = 'xxx3'
const u2 = new User2();
// 最起码保证u2.__proto__ 没有被重写
u2.__proto__.__proto__ = u;
console.log(u2.name); // xxx1

function User3() {}
const u3 = new User3();
u3.__proto__.__proto__ = u1;
console.log(u3.name); // xxx2

2.5 补充

  • 所有函数.__proto__ 都会指向Function.prototype
  • 所有函数.prototype.__proto__都会指向Object.prototype

3. 总结

大致的原型链的知识就这么多了。其实只要各位能做到手绘原型链的程度,基本就算掌握了,剩余的就差多多练习了。好了不多说废话了,今天的分享到此结束。如果各位觉得有任何不对的地方或是有别的想法的,都可以在评论区给小编留言,欢迎来多多交流

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

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

相关文章

vs 生成前事件 生成后事件命令

为了提高编译生成后的事件效率&#xff0c;不需要手动的拷贝到固定目录。可以在项目->属性中设备生成后事件。输入相应的命令行&#xff0c;即可。 Visual Studio中&#xff0c;可以在项目-》属性-》生成事件-》生成后事件命令行 xcopy 复制文件&#xff1b; /y/e 如果只复…

JavaEE【Spring】:MyBatis查询数据库

文章目录一、理论储备1、MyBatis 的概念2、MyBatis 的作用二、第⼀个MyBatis查询1、创建数据库和表2、添加MyBatis框架支持① 老项目添加MyBatisⅠ. 新增功能Ⅱ. EditStarters插件② 新项目添加MyBatis3、配置连接字符串和MyBatis① 配置连接字符串② 配置 MyBatis 中的 XML 路…

数据标注平台如何保护用户数据安全?

近期&#xff0c;在《麻省理工科技评论》在一篇万字长文调查中&#xff0c;一位年轻女子坐在自家的马桶上的图片也被扫地机器人拍摄下来&#xff0c;并被流传到网上、大范围传播。但事实上&#xff0c;这也并非是一件新鲜事了。例如&#xff0c;2020年秋&#xff0c;一系列从低…

为什么MySQL 要选择 B+树

一、什么是索引 在关系数据库中&#xff0c;索引是一种单独的、物理的对数据库表中一列或多列的值进行排序的一种存储结构。再直白点就是我们可以把索引理解成图书或者字典的目录。 既然索引是数据的一种存储结构&#xff0c;那么我们必然要对其进行存储&#xff0c;同时&…

你可以不用Git,但不能不会Git(二)基础(上)

目录 一.环境配置 二.本地初始化仓库 三.文件的两种状态 四.文件加入暂存区 五.文件提交与删除 1.提交文件 2.删除文件 一.环境配置 当安装Git后首先要做的事情是设置用户名称和email地址。这是非 常重要的&#xff0c;因为每次Git提交都会使用该用户信息。 设置用户信…

#G. 红旗招展

Description小J占山为王有一段时间了&#xff0c;他决定把自己的地盘打扮一下---将各种颜色的旗插在山头上当然某一座的山头只能用一种颜色的旗。整个地盘有N个山头&#xff0c;可看成是一棵有N个节点的树。小J还是有一点艺术细胞的&#xff0c;他不想整个地盘杂乱无章。于是他…

Kubernetes安装ingress-controller

IngressController 1. 安装 1.1 查看ingress-nginx的版本匹配 https://github.com/kubernetes/ingress-nginx/blob/main/README.md#readme 下载配置 wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.1.2/deploy/static/provider/cloud/de…

【回答问题】ChatGPT上线了!给我推荐20个比较流行的图像实例分割模型

给我推荐20个比较流行的图像实例分割模型 U-Net Mask R-CNN FCN SegNet PSPNet DeepLabv3 DenseASPP LinkNet RefineNet ENet ICNet BiSeNet CRF-RNN GCN Tiramisu FRRN DeepLabv3 PANet MaskLab Hybrid Task Cascade给我推荐20个比较流行的图像实例分割模型源码 好的&#x…

java学习之类变量

目录 一、类变量的引出 需解决的问题 传统代码 代码问题 解决方法 运行结果 二、类变量的内存布局 特点 内存中的位置 三、类变量定义 四、类变量语法 五、访问类变量 六、类变量细节 第一条 第二条 第三条 第四条 第五条 第六条 第七条 一、类变量的引出 需…

PHP8---MySQL扩展

目录 一、MySQL扩展的介绍 二、PHP和MySQL连接的基本操作 &#xff08;1&#xff09;MySQL连接的准备工作 &#xff08;2&#xff09;插入删除操作 三、查询操作 &#xff08;1&#xff09;mysqli_fetch_assoc &#xff08;2&#xff09;mysqli_fetch_row &#xff08;3…

19. 网站响应数据加一个简单的密,就能挡住80%的爬虫,你信吗?

本篇博客我们实现响应加密&#xff0c;由于本案例是JS逆向阶段的第一个案例&#xff0c;所以采用最基础加密手段。 爬虫训练场源码同步仓库为 GitCode 项目采集测试地址&#xff1a;爬虫训练场 爬虫训练场框架搭建Python Flask 端 Base64加密前台解密字符串渲染数据框架搭建 本…

Es之mapping

1&#xff09;、字段类型 2&#xff09;、映射 Mapping&#xff08;映射&#xff09; Mapping 是用来定义一个文档&#xff08;document&#xff09;&#xff0c;以及它所包含的属性&#xff08;field&#xff09;是如何存储和 索引的。比如&#xff0c;使用 mapping 来定义…

深入解析Linux虚拟化KVM-Qemu分析之KVM源码

说明&#xff1a; KVM版本&#xff1a;5.9.1QEMU版本&#xff1a;5.0.0工具&#xff1a;Source Insight 3.5&#xff0c; Visio 1. 概述 从本文开始将开始source code的系列分析了&#xff1b;KVM作为内核模块&#xff0c;可以认为是一个中间层&#xff0c;向上对接用户的控制…

idea中热部署插件JRebel的激活方式

idea中热部署插件JRebel的激活方式 一、打开jrebel 激活面板&#xff0c;如图&#xff1a; 二、选中Team URL&#xff08;connect to online licensing service&#xff09; 1、在上面的框中输入激活的url地址 http://127.0.0.1:8888/132d042c-3b1a-4c45-9044-b7897c3de7882…

遗传算法改进(IGA)+python代码实现

遗传算法改进&#xff08;IGA&#xff09;python代码实现一、变异概率的改进&#xff08;1&#xff09;单点变异&#xff08;2&#xff09;多点变异&#xff08;3&#xff09;选择性的突变概率二、交叉概率的改进三、适应度函数的改进&#xff08;1&#xff09;sigmoid函数&…

PGL 系列(六)node2vec

node2vec DeepWalk存在的问题是比较简单直接,而图结构往往是一个复杂结构,需要考虑很多因素,在深度优先搜索方法之外,还有广度优先搜索,结合以上两种方式可以更好的探索图模型,即node2vec。

华为交换机配置

文章目录网络规划与设计机房连线图PON网络配置网络规划与设计 OLT: 网络光线路终端(Optical Line Terminal) ONU分为两种 MDU&#xff08;Multi-DwellingUnit&#xff0c;多住户单元&#xff09; MDU主要应用于FTTB应用类型下的多个住宅用户的接入&#xff0c;一般具有至少4个…

【JDK工具】jinfo、jps、jstack、jstat、jmap

目录一、前言二、关键工具2.1 jps 显示所有JAVA进程信息1. 参数信息2. 常用命令2.2 jinfo 查看虚拟机配置参数信息1. 查看虚拟机参数 jinfo -flags pid2. 查看虚拟机指定参数 jinfo -flag 具体参数 pid3. 查看环境变量 jinfo -sysprops pid4. 参数列表2.3 jstack1. 能排查哪些问…

springboot整合之Validated参数校验

特别说明&#xff1a;本次项目整合基于idea进行的&#xff0c;如果使用Eclipse可能操作会略有不同&#xff0c;不过总的来说不影响。 springboot整合之如何选择版本及项目搭建 springboot整合之版本号统一管理 springboot整合mybatis-plusdurid数据库连接池 springboot整…

JVM面试大总结

一、汇总 JVM是运行在操作系统之上的&#xff0c;它与硬件没有直接的交互。先说一下JVM的内存区域&#xff0c;当函数开始运行时&#xff0c;JVM拿到自己的内存将自己的内存区域进行了分割&#xff0c;分为五块区域&#xff1a;线程共享的有堆、方法区&#xff0c;线程私有的有…