日常感想:
最近在准备前端的实习,短时间一下子内学到了很多的前端知识。昨天还面试到了一个实习岗位,知道自己几斤几两,但还是给我过了,十分羞愧难当,感觉自己的能力实际上没法匹配这个岗位。但另一方面心情还是很激动,毕竟是这么久以来第一份技术工作,这一步迈的确实晚了点。Anyway,以后要开始好好学习技术知识了。希望自己能快快进步。从这篇内容开始,记录学习前端以来学到的知识吧。
在面试的时候,发现自己代码能力确实很弱。菜鸡本🐔了。所以还会记录下刷的题目。
面试的时候,有一些问题卡壳了。有关options的,有关fetch的,有关ajax的内部实现的。都是些网络相关的。之后应该对这方面再了解一些。
今天这一篇写一写对JS原型链和原型的理解。
一开始真的搞不清prototype和__proto__两个属性到底代表了什么。看了那篇从无到一,从一到万物的所谓用上帝视角看原型链的文章,也看了有人用object.__proto__=Object.prototype 来简单概括的,但还是不明白。
所以只能靠举例子理解了:
在一家饮品店,有一台饮品制造机。它可以制造出很多种饮料。
我们把饮品制造机当作一个构造函数(因为它可以生产出很多饮品)
function Drink(){
}
有一天,阿方点了奶茶,于是这个制造机就制出了一杯奶茶。
var bubble_tea = new Drink()
对于这杯奶茶来说,我们可以说它的原型就是一杯饮品。什么样的饮品呢?就是这台饮品能制造出来的饮品咯。在这个例子里,这一杯奶茶就是一个实例对象,它的原型(__proto__)就是由这台制造机(function Drink())可以制造出来的。
那什么是prototype呢,我的理解是,这是一个抽象的概念。就像我们认识世界的时候,我们想到桌子,想到的不是一个特定的物体,而是一个抽象的桌子。但是所有的真实存在的桌子,一定都是符合我们脑海中的这种抽象的印象的(比如有支架,上面是个平面,可以用来放东西,是不是有椅子配套等等)。而在JS里面,我们也把这种抽象的概念做一个定义,也就是构造函数的prototype。我们想知道每个制造机会制造出来什么东西,比如这个饮品制造机,我们可以说它能制造出一杯饮料。但这个饮料显然是个很抽象的概念,为什么呢?生产出来的东西,要么是奶茶,要么是可乐,要么是咖啡,饮料只是个概念而已,是没有办法真的被制造出来的。所以function Drink()的prototype,也叫做原型对象,跟实例对象相对。换种理解方式来说,我觉得这个原型对象,其实是个模板。真实的一杯杯的饮料是按照这个被制造出来的,但这个模板本身,并不是一个实体的饮料,仍然只是一个概念。
说到这里,每个对象的__proto__属性也好理解了:也就是,对于这个真实存在的对象来说,它是按照哪个模板做的。function Drink()这样的构造函数的prototype属性就是:这个函数生成对象时用的模板是什么。
很自然的,bubble_tea.__proto__ 和 Drink.prototype指代的就是同一个东西。
它们指向的这个对象,里面都有个constructor这个函数,也就是Drink()这个构造函数。
关于原型链的话,就是我们一步步深究这个对象是什么的过程。比如:这杯奶茶就是一杯饮料,一杯饮料就是一个物体,最后的最后,原型不断向上追溯,发现最后是null。
也很make sense,毕竟无中生有,才会再生万物咯。