原型和原型链的理解_浅谈原型及原型链

0eb0edb02bbe73c7cbae9ff1ed35b495.png

Js中有一个很著名的知识点叫做两链一包,上次浅谈了一下自己关于闭包的理解,这次就来粗浅谈谈对我对两链中的原型链的理解吧。

什么叫原型链?要了解什么是原型链之前,我们应该先了解一下什么叫做原型。那什么叫原型呢,相对的想要了解原型,那就要先了解一下什么叫做构造函数。很头大吧,我只是想知道什么叫原型链却带了一大堆的问题出来。俗话说拔出萝卜带出泥,其实JS的很多的知识都是有关连的。好了废话不多说了,现在来说说什么叫做构造函数。

构造函数其实就是普通的函数,只是跟普通函数不同的是他的作用,它只是用来生成对象的。说白了,构造函数就是一个用来生成实例对象的工具。那么又出现了一个新的词语,实例对象,实例对象又是什么呢?实例对象就是通过构造函数New出来的一个对象。这样说很抽象,我们用一段代码来解释一下:

function Pro(){
        this.constructor = Pro;
        this.age = 5;
    }
    
var s1 = new Pro();
​

在这段代码里,函数Pro就是一个构造函数,而s1就是通过构造函数new出来的实例对象,说白了就是Pro这个构造函数模具通过new方法制造出来的实例对象,所以一个构造函数可以有多个实例对象的存在。现在我们说了实例对象,构造函数,那原型跟他们又有什么样的关系呢?而原型到底是什么也没有解释啊,现在我们就来聊聊原型。

原型其实也是一个对象,而在JS里,所有的对象都有其原型对象,而这个所谓的对象的原型对象可以把它理解成是这个对象的父亲,也就是说所有的对象都有一个父亲。而实例对象也是对象,那么也就是说实例对象也有一个原型。可是我们之前说了,实例对象是通过构造函数new出来的,那么它们三者之间又有什么关系呢?这样我们用一个图来解释一下:

c1782d04347c815caf4e8a93d42630bd.png

看不明白吧,没关系我来给你解释一下就明白了。前面说过实例对象是构造函数通过new来的,那么实例对象可以得到构造函数吗?显然是可以的,他们之间有一个constructor属性,实例对象只要通过constructor属性就可以获取构造函数(在没有改变实例对象原型的前提下)。那么构造函数跟原型的关系又是什么呢?其实它们两个在实质上是没有血缘关系的,他们之间只有一个prototype这个属性的关系,就是说构造函数可以通过prototype来获取到原型对象。而我们前面说过,原型对象是实例对象的父亲,那么实例对象就可以继承原型中的属性和方法。而实例对象也可以通过proto和Object.getPrototypeOf这两个方法来获取到原型。说了这么多实在是太绕了,一会原型一会对象的,那么我来打个简单的比喻可以让你更容易理解这三者之间的关系。构造函数好比是一台可以生产玉器的机器,实例对象就是由他生产出来的玉器,而原型对象就是原石(用来生产玉器的原材料)。生产机器和原石不是同一类型的东西,而它们之间又有一个材料供给的关系(这种关系就好比prototype属性)而玉器是通过机器造的,他有他们俩共同的特征,比如玉器的花纹是机器设定的,而玉器的成色之类的都跟原石有关。这样是不是就清楚了。

而我们前面也说过原型其实也是一个对象,后面我们又说只要是对象都有一个原型,那么也就是说原型也有它的原型,那么以此类推,直到找到最顶层的对象,再找就是null了,null是没有父级对象的。用一个图来解释就很明确了

fa96d7187f699d34703b223226fb6353.png

方框为 构造函数,圆框为 对象,特例:Object.prototype 的 隐式原型是 null (JS避免死循环)

而这样就形成一条原型链。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值