当前位置: 首页 > news >正文

JS原型链

JS的原型链


文章目录

  • JS的原型链
  • 前言
  • 一、原型是什么?
  • 二、原型链
  • 总结


前言

在使用数组或对象中的方法时,你是不是会感觉很奇怪,为什么仅仅是创建了一个数组或是对象,就能够使用它提供的方法呢?JS是怎么做到的呢?原因很简单,因为这些方法早就被定义在数组或对象的构造函数的原型上了,接下来,本篇文章就将着重讲解JS原型和原型链的相关知识。


一、原型是什么?

JS中,每一个函数都有自己的原型对象,这个对象会存放一些属性和方法。这个函数上会有一个prototype属性指向这个原型对象;同时,通过这个函数创建的实例对象身上都会有一个名叫__proto__的属性也指向这个原型对象。如下图所示:
在这里插入图片描述

正是因为这样的关系,所以当你使用实例上的方法或属性时,js会先从这个实例身上找,找到了对应的方法或者属性则直接调用或者返回,而如果找不到,js就会顺着__proto__这条线找到当前实例构造函数的原型上面,看这个对象身上有没有使用的方法或属性,如果有则使用原型上的属性和方法。

二、原型链

先看一张图
在这里插入图片描述
原型链本质就是原型关系的拓展,就像之前说的,原型本质就是一个对象,而任何对象都是Object这个构造函数的实例,因此当一个实例
众所周知,在JavaScript中,函数也是一种特殊的对象,因此任何通过构造函数创建的实例都可以找到Object这个构造函数的原型,从而使用它上面的方法,这里举一个例子
在这里插入图片描述
我在Object的原型上创建了一个叫sayHaHa的方法,并且用一个空对象执行这个方法,发现执行时并未报错,原因就是在obj这个空对象身上找不到sayHaHa这个方法,就去它的构造函数的原型身上找,此时发现Object的原型身上有这个方法,于是调用了这个方法。

这也解释了前言中的问题,当的使用对象或数组中的方法时,在对象和数组身上找不到对应的方法,于是js顺着__proto__这条线找到了它们的构造函数也就是Function和Object的原型上,而原型上是有这些方法的。

而原型链有一个特定,就是依次查找,首先在实例身上找,找到了直接调用,找不到就顺着__proto__去它的构造函数的原型上找,找到了就调用,还没找到就顺着构造函数原型对象的__proto__属性继续向上查找,直到找到为止;但就像上图所示,在JavaScript中,任何实例顺着原型链都会最终查找的Object的原型上,因此JS将Object构造函数的原型上的__proto__指向了null作为原型链的终点,当查到了null之后如果还没查到就会报错,提示找不到。
在这里插入图片描述

这就是JS中原型链的相关概念,活用原型链可以给我们代码开发提供很多便利,最典型的就是数组和对象原型链上提供的各种方法,另外vue2中全局事件总线也是通过向Vue的原型上注入$bus对象,再给这个对象上增加属性和方法从而达成组件间相互传参的。


总结

JS的原型主要是用于扩展实例对象身上的属性和方法,让同一个构造函数下的实例都能够使用这些新增加的属性或方法。调用属性或方法的方式就是顺着原型链一层一层向上查,直到找到对应的属性和方法(找到就返回或调用),或者找到了原型链的尽头null提示报错信息:XXX不存在。

http://www.lryc.cn/news/413740.html

相关文章:

  • 《Java初阶数据结构》----5.<二叉树的概念及使用>
  • git查看记录详解
  • 检索增强生成RAG系列10--RAG的实际案例
  • 程序员自我提升的全面指南
  • 【golang】Golang手写元组 tuple | golang tuple
  • golang中struct的tag -简记
  • 分布式领域扩展点设计稿
  • 玩转微信公众号变现:从新手到专家的全攻略
  • JVM: 方法调用
  • 测试面试宝典(四十一)—— 接口自动化的优缺点
  • “火炬科企对接”先进计算产业推进会 | 麒麟信安受邀参加,并签署开源生态合作协议
  • 中文网址导航模版HaoWa1.3.1/模版网站wordpress导航主题
  • 图欧学习资源网创站以来的更新日志(截止至2022.5.6)不完全统计
  • 现代前端架构介绍(第二部分):如何将功能架构分为三层
  • LeetCode Easy|【21. 合并两个有序链表】
  • 大模型的架构参数是指定义模型基本结构和组成的各种参数,这些参数对模型的性能、训练效率和泛化能力具有重要影响。以下是对大模型架构参数的详细介绍
  • 人工智能会越来越闭源——对话东北大学副教授王言治 | Open AGI Forum
  • 【前端】(仅思路)如何在前端实现一个fc手柄,将手机作为游戏手柄设备。
  • 三十种未授权访问漏洞合集
  • 【Golang 面试 - 进阶题】每日 3 题(十五)
  • Java中实现文件上传
  • 一种别样的Unicode Python编码方式,完美转换表情和阿拉伯语
  • 小白的晋升之路
  • WebLogic:CVE-2017-10271[XML反序列化]
  • Day13--JavaWeb学习之Servlet后端渲染界面
  • 【MySQL】全面剖析索引失效、回表查询与索引下推
  • 1、爬⾍概述
  • 科普文:微服务之分布式链路追踪SkyWalking单点服务搭建
  • R 语言学习教程,从入门到精通,R的安装与环境的配置(3)
  • 【Pageadmin】之cms漏洞