谈谈小白理解的js中的原型链问题

     上一篇博客提到了原型问题,为了理解清楚原型链的问题必须先要搞清楚原型的问题,为此,我们把上一篇博客中的原型的知识温故如下:

            原型中的问题主要是理清楚构造函数,实例和原型对象之间的关系,每一个构造函数都会有一个原型对象,原型对象都包含一个指向构造函数的指针(在属性constructor中),每个实例也都有一个指向原型对象的指针。如果我们进一步设想,把原型对象作为另一个类型的实例又会怎么样呢?按照之前的理论,这个实例也会有一个自己的原型对象,三条指针也都会有,假如原型还是另一个类型的实例?如此层层递进,我们可以得到一条链,这条链就是原型链。


     实现的代码如下:

     function SuperType(){

       this.property = true;

 } 

     SuperType.prototype.getSuperValue = function(){

      return this.property;

}

     function  SubType(){

       this.subproperty = false;

     //继承SuperType

     Sub.prototype =  new SuperType();

     Sub.prototype.getSubValue = function(){

        return this.subproperty;

};

     var  instance = new SubType();

     alert(instance.getSuperValue());      //true;


    我们把上面提到的原型和实例先捋清楚,先有一个类型SuperType,这个类型的原型是SuberValue.prototype,原型中写入了一个方法getSuberValue,由于没有实例化这个对象,所以目前有两条指针,一条是SuberValue中的prototype属性指向原型对象,还有一条是原型对象指向构造函数的指针。另一个类型是SubType和他的原型SubType prototype对象,用构造函数实例化了一个实例instance,目前为止的话这里又有了三条指针,请自行脑补,然后最关键的是:

    Sub.prototype = new SuperType();

    这句话就是把Sub的原型当成了Suber的一个实例了,既然当成了实例,那么这个“实例“  还要有自己的原型,那么这个原型就是SuperType prototype了,所以关键的是如下的这条指针: 这条指针是SubType Prototype中的Prototype属性指向原型对象SuperValue Prototype原型对象。这意味着原来存在于SuperValue中的所有属性和方法现在也存在于

SubType.prototype,而通过这条链,可以直接让instance直接调用getSuperValue方法了。


   由于我们知道,所有的引用类型本质上都是继承了Object类型,这个类型也是用原型链来实现的,所以上面的原型链还不够完整,还应该在原有的基础上加上三条,一条是Super Prototype中的prototype属性,值为指向Object prototype原型对象,因为superValue prototype原型对象作为Object 的实例,也可以说继承了Object,Object构造函数中有一条指针指向Object.prototype原型对象,原型对象中有一条指向构造函数。我们可以说instance是Object ,SuperValue,SubType中任何一个类型的实例,同理,我们也可以说这三个任意一个都是instance的原型。





  


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值