彻底深刻理解js原型链之prototype,proto以及constructor(二)

2020 年 11 月 20 日

彻底深刻理解js原型链之prototype,proto以及constructor(二)

前言


如果你能够啃下教程一并且吃透原型链的几个概念的话说明你在前端飞仙的路上又进了一小步···学习最怕的不是慢而是站!这篇教程主要目的对原型链概念进一步加深理解


巩固下教程一的知识


来看下面的例子:


var text=new String("我是文字");function Persion(name,job){    this.name=name;    this.job=job;}Persion.myName="lxm";Persion.prototype.sayName=function(){    alert(this.name);}var perison1=new Persion("lxm","20")
复制代码


思考:判断下列表达式返回的值:

(两分钟之内对八道的算及格,剩下的同学回头接着理解教程一,传送门在此 [http://0313.name/2017/01/13/prototype-proto-constructor.html])


perison1.__proto__===Persion.prototype;perison1.name===Persion.name;perison1.prototype.__proto__===Object.prototype;Persion.prototype.__proto__===Object.prototype;Persion.__proto__===Function.prototype;Persion.constructor===perison1;Function.__proto__===Object.prototype;Function.prototype.__proto__===Object.prototype;typeof Persion.prototype;typeof Function.prototype;
复制代码


原型链图


这个图绝对是网络上独一无二独一份,此乃小米飞升教程独家秘籍!因为博主在学习过程中发现对文字的理解和记忆远远不如一个图来的更深更直观,更加透彻,为了您更好的学习原型链,博主特意花了一上午的时间用 mermaid 绘制了这个原型链的关系图,而且通过这个图我们能够发现很多有意思的事情 为了关系图更加直观和清晰,隐去了一些引用线路,其中:


  • 圆形代表对象的名字

  • 方形代表属性名

  • 实线代表对象的分界

  • 虚线代表引用

  • 菱形代表基本值



  • 原型链是单链,只往一个方向流向,没有回路

  • 只有Function的 proto 指向自己的prototype,这也向我们解释了为什么Function.prototype类型是function

  • 我们通过 proto 只能获取到原型对象中的方法和属性,所以persion1通过原型链是获取不到Persion的myName属性,但是我们可以通过原型对象的constructor来获取或者修改Persion的属性(这点太给力了)


请注意,有时候这个方法也不好使,因为原型对象的constructor是可以改变的,不一定指向原型对象所在的函数对象


继续上面的例子:


persion1.__proto__.constructor.myName="我变了耶!";console.log(Persion.myName); //我变了耶
复制代码


  • 普通对象的 proto_ 一定指向创造它的函数对象的prototype

  • 原型对象的 proto 一定指向Object.prototype!

  • 通过图我们可以简单理解,拥有原型对象属性的对象是函数对象,否则为普通对象

  • 原型链是有开始和尽头的,开始于null,结束于普通对象

  • 所有的函数对象都是Function以new的方式创造出来了,包括Function自己且每个函数对象的 proto 都指向了Function.prototype

  • Object是所有对象的父类,我们也可以称之为基类,不过不要纠结于叫什么,因为我们通过图可以看到每一个对象(不管是原型对象还是普通对象还是函数对象)的通过原型链都可以引向Object.prototype


以上九条我称为原型链之九句真言(不要太在意名字,我自己随便起的 ~)


意外收获:this.name和this.job难道不应该在Persion中也有一份吗?无数个日夜,愚笨的博主对this的用法都不甚了解,直到我画出了这种图,我彻底明白了this的含义,就是谁运行包含this的这个函数,this就把挂在它身上的包袱(属性)甩给谁! 看到了吗,persion1调用了Persion,那么自然多了2个属性,但是注意,name跟job并不是Persion的属性!!


思考:图中没有画出 Object. proto 的指向,请问他指向哪?(请只依据九句真言解答)


思考题解答


思考:判断下列表达式返回的值:


perison1.__proto__===Persion.prototype;
复制代码


首先判断perison1是通过new方式被Persion创造出来的,依据九句真言第4条得出 :true


perison1.name===Persion.name;
复制代码


通过关系图可以看到不相等,我已经在意外收获中解答了,答案为:false


perison1.prototype.__proto__===Object.prototype;
复制代码


只看图可以看到perison1没有prototype,是普通对象所以答案为:js报错~~


Persion.prototype.__proto__===Object.prototype;
复制代码


参考九句真言第5条:答案为:true


Persion.__proto__===Function.prototype;
复制代码


Persion为函数对象,参考九句真言第8条,答案为:true


Persion.constructor===perison1;
复制代码


Persion是由Function创造出来的所以Persion.constructor指向Function,答案为:false


Function.__proto__===Object.prototype;
复制代码


Function我们已经反复强调是由自身创造所以Function. proto ===Function.prototype;,答案为:false


Function.prototype.__proto__===Object.prototype;
复制代码


根据九句真言第5条,答案为:true


typeof Persion.prototype;
复制代码


答案为:object


typeof Function.prototype;
复制代码


答案为:function,注意这个是比较特殊的原型对象


思考:图中没有画出 Object.proto 的指向,请问他指向哪?(请只依据九句真言解答)


下面来分步解答


  • Object属于函数对象

  • 依据九句真言第八条得出函数对象的 proto 都指向了Function.prototype

  • 所以Object. proto ===Function.prototype


这一点是不太好理解的,是 Function 创造了 Object,然后 Object 创造了 Function 的原型对象 prototype 所以就有了


Object.__proto__===Function.prototypeFunction.prototype.__proto__===Object.prototype
复制代码


不要太纠结于此,只要理解就好


结束语


好了,原型链的概念原理通过这 2 篇教程我相信大家已经滚瓜烂熟了!下面的教程,我们会着重研究下原型链在实际的应用!


本文转载自宜信技术学院。


原文链接


彻底深刻理解js原型链之prototype,proto以及constructor(二)


2020 年 11 月 20 日 10:10694

评论

发布
暂无评论
发现更多内容

即将写入MySQL源码的官方bug解决之路

数据君

MySQL

SQL数据库集合运算

大规模数据处理学习者

SQL表联结 SQL集合运算

什么是服务器租用?

德胜网络-阳

容器和虚拟机到底有啥区别?

网管

容器 虚拟机 容器化

断供,危机or契机?开源商业化or社区化?后疫情下的开源路这样走 | 大咖对话

易观大数据

架构师第一期作业(第 9 周)

Cheer

作业

代码写的烂才是原罪?字节三面+微信四面+PayPal四面,大厂面经分享

Crud的程序员

架构 面试 数据 字节

厉害了!阿里内部都用的Spring+MyBatis源码手册,实战理论两不误

小Q

Java spring 学习 面试 mybatis

数字货币交易所开发源码,币币撮合交易系统搭建

WX13823153201

adb的常用操作命令

Yolanda_trying

Vokenization:一种比GPT-3更有常识的视觉语言模型

脑极体

Java中的线程与C++中的区别

jiangling500

Java c++ 线程

区块链数字货币商城系统开发模式

薇電13242772558

区块链 数字货币

直播卖货已成趋势

anyRTC开发者

音视频 WebRTC RTC

支撑2715​亿元海量订单 揭秘京东大促背后的数据库基石

京东智联云开发者

数据库 数据仓库 云服务 云数据库

有点意思的gif动图生成平台开发实战(二)

徐小夕

Java Vue 前端 GIF React

.net core增强工作流组件,基于稳定平台,多项目整合开发

雯雯写代码

程序员如何判断跳槽岗位是否有坑!

Java架构师迁哥

读完某C++神作,我只记住了100句话

MySQL从删库到跑路

c++

6个JDK自带JVM调优工具,一次性打包给你说清楚

田维常

jvm调优

《程序员面试金典》.pdf

田维常

面试

限流10万QPS、跨域、过滤器、令牌桶算法-网关Gateway内容都在这儿

周老师

Java 微服务 算法 并发 QPS

超越竞争文化:致善式创新能否打造手机产业的“海法城”

脑极体

程序员双十一剁手指南

数据君

腾讯云 程序员

花四个月和阿里面试官“大战”7回合,成功将其“斩于马下”!复盘面试题及答案!

Java架构追梦

Java 阿里巴巴 面试题 面试经历 java架构

【JVM】肝了一周,吐血整理出这份超硬核的JVM笔记(升级版)!!

冰河

性能优化 内存模型 JVM 堆栈 JVM笔记

响应式关系数据库处理R2DBC

程序那些事

MySQL R2DBC 程序那些事 响应式系统 响应式数据库

Java中NullPointerException的完美解决方案

Silently9527

java8 Optional

甲方日常 52

句子

工作 随笔杂谈 日常

这份算法攻略,我拿到了5个大厂的offer

yes的练级攻略

面试 算法 笔试

2020双十一,阿里云GRTN拉开直播和RTC技术下半场的序幕

阿里云视频云

架构 云直播 直播 流媒体 直播架构

彻底深刻理解js原型链之prototype,proto以及constructor(二)-InfoQ