白话原型链,这下你应该能懂了吧?

118 阅读4分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第28天,点击查看活动详情

原型和原型链是javascript中非常重要的知识。我之前对它并不是很理解。今天记录一下自己的理解。首先请允许我先按照正常模式来记录一下。

正常模式

原型链

大部分函数A都会存在一个特殊的属性prototype,它指向一个对象B,我们称之为原型对象,原型对象有一个特殊的属性constructor,它指向这个函数A;

如果通过这个函数A new出来的对象,我们称之为实例对象C;每一个对象类型值都存在一个属性__proto__,而对象的__proto__属性指向该对象的构造函数的实例。

当我们想要获取C的属性的时候,程序会先查找实例对象C本身是否存在该属性,如果不存在,则去查找构造函数或者类A是否存在,如果A依然不存在,再继续查找原型对象B上是否存在,以此类推直到找到最上层null为止。

解释一下:

  1. 为什么是大部分函数存在prototype属性?
    MDN上描述:

所有的函数会有一个特别的属性 —— prototype

但是箭头函数的prototype属性返回的是undefined,所以在这里我认为它不存在prototype属性.

截屏2022-04-30 22.30.39.png

  1. 除了函数,其他类型会存在prototype属性吗? 我了解到的是,只有函数类型会存在该属性。有人会问,我经常使用String.prototype.xxx = function(){}的方式进行增添属性的呀。其实String也是函数。

截屏2022-04-30 22.46.20.png

  1. 每一个对象类型值都存在一个属性__proto__吗? 如果十分严格的来说并不是,因为undefind和null在获取__proto__的时候会报错,其他类型值都是可以的。

截屏2022-04-30 22.38.05.png

截屏2022-04-30 22.39.45.png

  1. 原型对象都会存在constructor吗? 会的

你看懂了吗?

通过上方的说法你看懂了原型链吗?也许很多人和之前的我一样,比较懵。下面我们看一张图片可好?

3.png 图片拍的不是太清楚,不知道看了图片能否更清楚一些。

白话模式

我要开始一本正经地胡说八道了:
在一个世外桃源,大家生活的很幸福。在那里生活的人有一个深入骨髓的,死都不会发生改变的事情:

所有的人只有一个伴侣,不会发生出轨的事情。

在这个世外桃源中,每一个女人(函数)都会有一根名为prototype的针,这根针非常的厉害,只要向空中一抛,就能带着女人找到她的丈夫(原型对象)。世界是公平的,不能只是女找男吧?女人们的丈夫手中也有一根针,但是它的名字是constructor,这根针向着大地一指,就能带着他找到自己的老婆。看看,这个世界是不是很神奇,当你要找自己的爱人,只需要玩玩针就好了。难道这里所有人都有配偶吗?现实世界可不会。其实这个世界也不会,因为有一部分女人(比如箭头函数)因为长得太漂亮遭到了上天的嫉妒,她们因此失去了那根名为prototype的针,找不到自己的丈夫。

嗯?这里的人都是夫妻生活,没有孩子吗?当然有啊,每个女人都可以有很多孩子,当然如果不需要那么多,也可以只要一个孩子,这些孩子不但完美的继承了妈妈的所有特点,还拥有属于自己的个性,这让世界变得更加丰富多彩。

哎哎哎哎,这些孩子也都有针吗?当然了,上面提到的针呀,是女人和他们丈夫所特有的,除此之外呢?这里的每个人都有一根针,那就是名为__proto__的针。这根针的作用很奇怪,它不是帮助小蝌蚪找妈妈,而是帮助孩子找爸爸。

对了,大家怎么交易,怎么生活呢?既然是世外桃源,食物当然是使之不尽的啦,但是食物却分门别类的掌握在不同的人手里。如果他们想要其他人手里的食物,就去找另外的孩子要,孩子那里没有就去找他妈妈,他妈妈也没有就去找他爸爸,这样找下去肯定能找到的,如果最后找不到怎么办呀?这就要说到这个世界里万能之物了:undefined。

undefined在这里是万能的,能代替所有不存在或者没有的东西,哪怕是人。最后找不到的食物,就会被分给一份undefined,甚至那些没有丈夫的美丽女人都会被分配一份undefined,但却不会有孩子,也不能给个undefined,因为她们太美丽,遭天妒忌。

胡邹

啰里八嗦一大堆,看着挺烦的,其实我写的也挺烦的。找一个合适的比喻不是太容易呀,虽然漏洞百出,但是应该写出了大概的内容。虽然不严谨,但还是希望自己能更多的如此白话。