何为JS中的原型链

为了让思路更为清晰,我们把整个内容分为四层来说

前提:我们都知道在js中万物皆对象,而只要是对象就会有自己的原型对象

第一层:

首先我们需要知道,在js中每个函数对象都有一个隐藏的属性,这个属性叫做prototype。在prototype这个属性里面存着一个地址,这个地址指向着一个对象,这个对象就是我们要说的原型对象。简单理解就是函数里的这个prototype属性相当于一个指向本函数原型的一个指针。

 

上图中的Object就是test函数的原型对象。

第二层:

因为原型对象也是对象,所以也会有自己的属性,函数的原型对象有一个叫constructor的属性,这个属性和前面提到的prototype属性很相似,也相当于是一个指针,指向的是函数本身,这样函数本身和其原型对象就形成了一个相互指向。

如上图所示我们可以看到constructor属性指向的正是test函数本身,所以test和其原形成了一个相互指向 。

第三层:

因为原型对象也是一个对象所以也会有自己的原型对象

可以通过它自身的__proto__属性去访问(js中每个实例对象都有一个__proto__属性)

为了预防搞混,在这里我们把这个原型对象称为test函数对象的二级原型,把前面的原型对象称为test函数对象的二级原型。同样的这个二级原型中也有一个constructor指针指向前面的一级原型(因为二级原型对象是一级原型对象的原型对象)。可能到这里,有的小伙伴会觉得对不会一直延申下去?其实不会,因为到二级原型的时候,其__proto__属性的值为null。所以对象的二级原型对象已经到了原型对象的顶层,此时的原型对象也就是Object的原型对象。(js中Object对象是所有对象的父类对象,也就是对象的顶层)

如上图可以从浏览器的输出中看到二级原型对象的__proto__属性值为null,且二级原型对象和Object的原型对象是一致的。

 第四层:

原型链

当我们以构造函数的形式去调用一个函数的时候,也就是用这个函数去创建实例对象的时候,那么这个实例对象就会继承构造函数中原型的属性或者说方法,当实例对象在调用一个方法时,会先在自身的属性中寻找,若没有则深入到他的原型中对象中去寻找,一层一层的往上找,找到了就可以直接调用。这就是我们所谓的原型链。

如果实例想要访问原型对象也可以通过自身的__proto__属性访问到。

如上图结果可知,我们obj对象中并没有定义toString方法,但是却可以直接调用该方法。这就体现了原项链中属性的调用。

 

 以上就是有关于js中原型链的介绍,希望能给看到的小伙伴提供到帮助。

 

 

 

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值