JS知识补充-JS原型链

news2024/12/23 14:36:39

概述

JS原型链

别名:隐式原型链

作用:根据一定路径查找属性(方法)

作用举例:我们定义一个构造函数Fn,使用此构造函数创建一个对象fn1,接着使用创建的对象fn1去调用toString方法并打印,我们再使用对象fn1去调用test方法并打印,结果是第一个调用toString方法不会报错,而第二个调用test方法会报错。

代码:

<script>
     function Fun(){} //构造函数
     var fun1 = new Fun(); //创建对象
     console.log(fun1.toString()); //[object Object]
     fun1.test() //报错fun1.test is not a function
 </script>

提出问题:两个方法我们对象中都没有定义,但为什么会出现一个调用成功,一个却调用失败呢?

说明:调用成功是因为当我们对象去调用toString方法时,先在自身查找是否存在此方法,如果不存在,则会沿着某路径查找下去直到尽头,此路径就是原型链,当找到原型链的尽头时,我们会找到toString方法。所以执行成功。而test方法直到找到尽头也没有找到,所以就会报错。

至于原型链的路径是怎么样的,toString方法是在哪声明的,原型链尽头又是哪,这些问题下面会介绍到。

显示原型和隐式原型

核心概念

1.基本的,每一个函数都会存在一个属性:prototype,prototype属性默认指向Object空对象,此对象既称为原型对象

prototype属性就是我们所说的显示原型。原型中有一个属性constructor,它指向函数对象。

//我们可以打印一下函数的prototype属性
function Fun(){}
console.log(Fun.prototype);

打印结果如下:

  1. 基本的,每一个实例对象都会有一个属性:__proto__,__proto__默认指向构造函数的prototypy属性值。__proto__属性就是我们所说的隐式原型

3.特殊的,Object对象中的__proto__指向Object的原型对象,此原型对象中已经存在了如toString()等方法。值得注意的是,Object的原型对象中的__proto__不再有指向,值为null,既为尽头。

4.原型链路径:当我们查找某属性,自身没有时,会沿着__proto__查找,直到尽头,因此原型链也称为隐式原型链。

prototype和__proto__的生命起点:prototype由函数的创建而产生,__proto__由实例对象的创建而产生。
**直接看核心概念会很懵,接下来对着核心概念看如下的内存解析图会清楚很多。

内存说明

内存解析图一

根据以上核心概念,理解下方的内存中指向。
记住:函数中有prototype,对象中有___proto__

解读:首先创建了一个Fn函数,语句function Fn(){},可以看作var Fn = new Function();

所以首先在右边的堆空间中开辟了一块空间,也就是图中的A块,返回一个引用地址值0x123返回给栈空间的Fn,根据核心概念,函数中会有prototype属性存在,而prototype会指向一个

Object空对象,接下来我们有Fn函数创建了一个fn对象,语句var f1 = new Fn();所以会在内存中开辟一块空间,也就是图中的B块,根据核心概念实例对象中会有__proto__属性,指向构造函数的prototype,最终也会指向Object空对象块。

此图仅说明了函数和实例对象的内存指向,并未指向尽头。

内存解析图二

解读:首先创建了一个构造函数Fn,在其中添加了一个方法test1,并且由Fn创建了一个对象fn,这和上面的内存解析相同,但是有不同的是,在其中有语句:Fn.prototype.test2=function(){log...},此语句是在Fn的原型对象中添加了test2方法,由图就可以看出来。值得注意的是,可以看到Object函数,此函数是一开始就存在了,引用地址是0x456,Object函数对象中存在显示原型prototype,但我们知道,一般的函数的prototype属性指向的是Object的一个空对象,但是,Object函数的prototype是一个特殊,他指向的是Object的一个实例对象,此实例对象中存在了许多内置方法,此实例对象中的__proto__值为null,既为原型链尽头。

关于原型链的属性问题

在上面的演示和说明中,都是以方法来说明,那么关于原型链操作属性时是什么情况呢?

其实是有些区别的。

原型链操作属性情况

  1. 读取对象的属性时,自身没有时依然会自动到原型链中查找。

  1. 设置对象的属性时,当自身没有此属性时,就会为对象直接添加此属性。

  1. 方法一般定义的原型中,属性一般通过构造函数定义在对象本身。

总结(原型链查找过程说明)

原型链过程:使用一个构造函数创建了一个对象,使用此对象调用某属性(方法),先会在自身中查找是否定义了此属性(方法),如果找到则返回,如果没有找到,则会通过隐式原型__proto__地址值找到构造函数的prototype属性值,然后就会找到指向的原型对象(原始为空的object对象),查找此原型对象是否存在此属性(方法),如果存在则引用,如不存在,在继续通过原型对象的__proto__找到Object的prototype属性,prototype会找Object的原型对象,在其中查找,有则引用,没有则返undefind,因为当Object原型对象中也没有时,就会接着找__proto__,但是我们知道Object原型对象中的__proto__值为null,所以就可以说达到了尽头。

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

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

相关文章

【阶段三】Python机器学习03篇:机器学习中的函数、机器学习中的梯度下降、机器学习的数据结构:张量与机器学习概率与统计基础

本篇的思维导图: 机器学习中的函数 函数描述了输入与输出的关系。在函数中,一个事物(输出)随着另一个(或一组)事物(输入)的变化而变化,如下图所示。 输入与输出的关系一般情况下,用x(或x1,x2,x3,…)表示输入,用y表示输出,并把它们叫作变量,…

Java设计模式中的设计原则/开闭原则、里氏代换原则和依赖倒转原则又是什么,怎么用

继续整理记录这段时间来的收获&#xff0c;详细代码可在我的Gitee仓库SpringBoot克隆下载学习使用&#xff01; 3.设计原则 3.1 目的 提高软件系统可维护性与可复用性增加软件可扩展性与灵活性节约开发成本与维护成本 3.2 开闭原则 3.2.1 特点 对扩展开放&#xff0c;对修…

实战干货|自研数据存储迁移MySQL实战

背景 最近公司内部在做某自研数据存储的下线工作&#xff0c;这里我们暂且化名其为DistributeSQL&#xff0c;由于DistributeSQL不再进行服务支持&#xff0c;需要迁移项目中使用到该存储到其他数据存储中。 本篇来聊聊这次在数据存储迁移过程中的方案设计思路、实现的大致细节…

中老年服装电商小程序开发

近年来&#xff0c;随着网络的发展&#xff0c;中老年服装电商小程序开发有了很大的进步。这种平台不仅可以方便用户购买到最新最时尚的产品&#xff0c;而且还能帮助商家提高销售业绩。 1&#xff1a;中老年服装电商小程序开发的优势 中老年人对商品信息需求大、容易接受新鲜…

实验⼀:Windows主机漏洞利⽤攻击实践

永恒之蓝简介 永恒之蓝&#xff08;Eternal Blue&#xff09;爆发于2017年4月14日晚&#xff0c;是一种利用Windows系统的SMB协议漏洞来获取系统的最高权限&#xff0c;以此来控制被入侵的计算机。甚至于2017年5月12日&#xff0c; 不法分子通过改造“永恒之蓝”制作了wannacry…

【ROS】—— ROS重名问题(九)

文章目录前言1. ROS工作空间覆盖2. ROS节点名称重名2.1 rosrun设置命名空间与重映射2.1.1 rosrun设置命名空间2.1.2 rosrun名称重映射2.1.3 rosrun命名空间与名称重映射叠加2.2 launch文件设置命名空间与重映射2.3 编码设置命名空间与重映射2.3.1 重映射2.3.2 C 实现:命名空间3…

Maven基础学习——依赖配置(1):配置同一项目下的三个工程

依赖配置一、前言二、创建第一个工程三、新建第二个工程四、创建第三个工程五、配置1.每个工程的.xml文件2.文件配置六、结语一、前言 在讲述依赖配置时&#xff0c;需要使用实例来说明&#xff0c;在B站黑马课程&#xff08;第12小节&#xff09;中没有讲到如何配置基础的三个…

[Effective Objective] 熟悉Objective-C

了解 Objective-C Objective_C 是一种面向对象的语言。但与jave、C等语言不同&#xff0c;它使用了消息结构&#xff08;messaging structure&#xff09;而非函数调用&#xff08;function calling&#xff09;。Objective-C由Smalltalk演化而来&#xff0c;后者是消息语言的…

React 学习笔记总结(六)

文章目录1. redux 介绍2. redux 工作流程3. redux 的使用4. redux 完整结构补充5. redux的 异步action6. react-redux库 与 redux库7. react-redux库的 实战8. react-redux的connect 最精简写法9. react-redux的 Provider组件作用10. react-redux 整合UI组件 和 容器组件11. re…

webgl图形平移、缩放、旋转

文章目录前言平移图示代码示例缩放图示代码示例旋转公式推导代码示例总结前言 在webgl中将图形进行平移、旋转、缩放的操作称为变换或仿射变换&#xff0c;图形的仿射变换涉及到顶点位置的修改&#xff0c;通过顶点着色器是比较直接的方式。本文通过着色器实现对webgl图形的仿…

ArcGIS基础实验操作100例--实验65按字段调整点符号方向

本实验专栏参考自汤国安教授《地理信息系统基础实验操作100例》一书 实验平台&#xff1a;ArcGIS 10.6 实验数据&#xff1a;请访问实验1&#xff08;传送门&#xff09; 高级编辑篇--实验65 按字段调整点符号方向 目录 一、实验背景 二、实验数据 三、实验步骤 &#xff0…

计算机组成原理_总线

计算机组成原理总目录总线概述 1. 总线介绍 我们知道计算机中有CPU、主存、辅存&#xff0c;以及打印机、键盘、鼠标等等的一些外设 那么各个设备之间肯定是要进行数据传输的&#xff0c;这就需要许多线路将它们连接起来 第一种方法&#xff1a;两两相联 外设数量越多&#xf…

35、基于STM32的电子钟(DS1302)

编号&#xff1a;35 基于STM32的电子钟&#xff08;DS1302&#xff09; 功能描述&#xff1a; 本设计由STM32单片机液晶1602按键DS1302时钟组成。 1、采用STM32F103最小系统。 2、利用DS1302芯片提供时钟信号 3、液晶1602实时显示年月日、时分秒、星期等信息。 4、三个按键可…

隐形AR眼镜厂商Mojo Vision裁员75%,专注Micro LED技术

1月7日青亭网报道&#xff0c;隐形AR眼镜厂商Mojo Vision官方宣布了一项重大调整&#xff0c;其中因为产品进展问题&#xff0c;同时还有融资进展受阻等面临大裁员&#xff0c;将进行一系列中心调整&#xff0c;据了解本次裁员比例高达75%。重点关注&#xff1a;1&#xff0c;M…

【Day5】力扣第328题,奇偶链表

前言&#xff1a; 大家好&#xff0c;我是良辰丫&#x1f680;&#x1f680;&#x1f680;&#xff0c;今天带大家刷一个力扣链表题&#xff0c;有人可能会说&#xff0c;一道题够嘛&#xff0c;刚开始刷题别着急&#xff0c;毕竟&#xff0c;心急吃不了热豆腐&#xff0c;&…

Mathorcup数学建模竞赛第六届-【妈妈杯】B题:小区车位分布的评价和优化模型(附特等奖获奖论文和Java代码)

赛题描述 随着现代社会经济的快速发展,房地产成为国家经济发展中重要的经济增长点之一。而小区内汽车停车位的分布对于小区居民的上下班出行影响很大。请建立数学模型,解决下列问题: 问题1:分析评判小区汽车停车位分布是否合理的几个关键指标,建立评判车位分布合理的数学…

嵌入式Linux-对子进程的监控

1. 进程的诞生与终止 1.1 进程的诞生 一个进程可以通过 fork()或 vfork()等系统调用创建一个子进程&#xff0c;一个新的进程就此诞生&#xff01;事实上&#xff0c;Linux系统下的所有进程都是由其父进程创建而来&#xff0c;譬如在 shell 终端通过命令的方式执行一个程序./…

leetcode 1658. 将 x 减到 0 的最小操作数[python3 双指针实现与思路整理]

题目 给你一个整数数组 nums 和一个整数 x 。每一次操作时&#xff0c;你应当移除数组 nums 最左边或最右边的元素&#xff0c;然后从 x 中减去该元素的值。请注意&#xff0c;需要 修改 数组以供接下来的操作使用。 如果可以将 x 恰好 减到 0 &#xff0c;返回 最小操作数 &a…

HTML与CSS基础(四)—— CSS基础(选择器进阶、Emmet语法、背景属性、元素显示模式、三大特性)

一、选择器进阶目标&#xff1a;能够理解 复合选择器 的规则&#xff0c;并使用 复合选择器 在 HTML 中选择元素1. 复合选择器1.1 后代选择器&#xff1a;空格作用&#xff1a;根据 HTML 标签的嵌套关系&#xff0c;选择父元素 后代中 满足条件的元素 选择器语法&#xff1a;选…

第二章JavaWeb基础学习路线

文章目录什么是Java WebJava Web基础的技术栈关于我们的客户端与服务端&#xff08;BS&#xff09;我们客户端的形式**PC端网页****移动端**服务端应用程序关于请求&#xff08;request&#xff09;和响应(response)类比生活中的请求和响应服务器中的请求和响应项目的逻辑构成架…