当前位置:网站首页>一文搞懂JS的原型链
一文搞懂JS的原型链
2022-07-29 13:17:00 【小东同学】
原型链可以说是JavaScript中非常重要的概念,但是其概念对于部分同学可能来说非常的抽象,为此,本篇文章/笔记将深入浅出原型链,不再迷惑!
JavaScript中的原型链是一个非常有魔力的东西
在
javascript中,实例对象与原型之间的链接,叫做原型链。其基本思想是利用原型让一个引用类型继承另一个引用类型的属性和方法。然后层层递进,就构成了实例与原型的链条,这就是所谓原型链的基本概念。[1]
Javascript
0x01 基本概念
首先先记住几个概念:
- 隐式原型:所有引用类型(函数、数组、对象)都有
__proto__属性,例如arr.__proto__ - 显式原型:所有函数拥有
prototype属性,例如:func.prototype - 原型对象:拥有
prototype属性的对象,在定义函数时被创建
再理解一下prototype与__proto__
- js中所有的函数都有一个
prototype的属性,该属性引用了一个对象,该对象叫做原型对象 - js中每个对象都有一个
__proto__属性,该属性指向它构造函数的prototype
0x02 构造函数
上面的概念中提到了构造函数,那么什么是构造函数呐?
在
JavaScript中,用new关键字来调用的函数,称为构造函数。构造函数首字母一般大写[2]
先看一个例子:
function Person() {}
var person = new Person()
第一行代码声明了一个名为 Person 的函数,第二行代码,根据上面的构造函数定义,那么函数 Person 可以称作一个构造函数
在 JavaScript 的内置对象(比如:Object、Array)中,都是 Function构造函数的实例
0x03 prototype与proto的属性
规定 __proto__ 与prototype的属性包括 __proto__ 和 constructor 两个
__proto__指向对象的构造函数的prototypeconstructor指向对象的构造函数
在浏览器下的运行情况可以看到
实际情况
在上面的例子中person对象是 Person 构造函数的一个实例,那根据规定,下面的关系一定成立
person.__proto__ === Person.prototype // output:true
即person的构造函数是Person这个结论是正确的
在其中的概念可以看到__proto__中有__proto__,那么是不是就可以无限访问下去呐?那就会产生一个疑问,__proto__到最后是个啥?
0x04 原型链
通过上面的问题,自然就引入了“原型链”的概念,在这一条__proto__的链路上,最终所有都指向了Object
为了在整体上有一个清晰的概念,我做了一幅图
一图看懂原型链
小伙伴们可以仔细推敲一下这个图,是不是脑袋里清晰多啦,JavaScript皆对象!
0x04 原型链查找机制
知道了原型链,但还不知道原型链到底有什么用对吧?搞这么复杂,到底有啥用?
有用!一开始的描述当中,又看到“继承”这个关键词,对于熟悉了面向对象的小伙伴,没什么理解难度,入门小伙伴可以理解为“子承父业,青出于蓝而胜于蓝”
过于抽象,举个栗子
不举了,emmm。。。
原型链里的查找机制:基于 __proto__ 向上搜索原则,例如,person实例对象没有eat方法,则向上查找person.__proto__其构造函数Person的prototype中查找是否存在eat方法,如果存在,则直接调用,否则基于向上查找Object.prototype中是否存在eat方法,若也不存在,则返回undefined
埋一个伏笔:原型链会不会有什么安全问题呐?
REFERENCE
[1] 什么是javascript原型链?
[2] JS构造函数理解
边栏推荐
- A recent paper summarizes
- BGP联邦综合实验
- Legendary version adds npc modification, adds npc method and configuration parameter tutorial
- JUC阻塞队列-ArrayBlockingQueue
- SIP系统组成格式
- What is the difference between the legendary server GOM engine and the GEE engine?
- Sql file import database - nanny level tutorial
- 25年来最经典的电影特效名场面
- 阿里巴巴 CTO 程立:开源是基础软件的源头!
- 浅谈MES系统质量管理的方案
猜你喜欢

阿里云官方 Redis 开发规范!

【kaggle】Spaceship Titanic - 预测哪些乘客被运送到另一个维度【CatBoost - 10%】

Understand the yolov7 network structure

常坐飞机的你,为什么老惦记着“升舱”?

R Error in :missing values are not allowed in subscripted assignments of data frames

"Industrial flaw detection depth study method" the latest 2022 research were reviewed

线程池面试汇总

推荐几款2022年好用的设备管理系统(软件)

Gee engine modification UI interface graphic tutorial

第二轮Okaleido Tiger热卖的背后,是背后生态机构战略支持
随机推荐
阿里云官方 Redis 开发规范!
What is the difference between the legendary server GOM engine and the GEE engine?
Py之eli5:eli5库的简介、安装、使用方法之详细攻略
frp-免费内网穿透
线上支付,出款和收款
栈题目:标签验证器
2022年七夕情人节有什么值得推荐的礼物选择?实用且高级礼物推荐
kotlin协程与线程池
即时通讯移动端开发之网络连接优化
程序员入门的第一个程序,打印输出 “ HelloWorld “
MySQL8.0学习记录21 - 视图
浅谈MES系统质量管理的方案
如何把Netflix数据集转换成Movielens格式?
常坐飞机的你,为什么老惦记着“升舱”?
人脸合成效果媲美StyleGAN,而它是个自编码器
【kaggle】Spaceship Titanic - 预测哪些乘客被运送到另一个维度【CatBoost - 10%】
Vscode搭建ESP32-C3开发环境
Dataset:Medical Data and Hospital Readmissions医疗数据和医院再入院情况数据集的简介、下载、使用方法之详细攻略
码蹄集 tourist
浅谈防勒索病毒方案之主机加固