您的位置:首页 > Web前端 > JavaScript

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

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

            原型中的问题主要是理清楚构造函数,实例和原型对象之间的关系,每一个构造函数都会有一个原型对象,原型对象都包含一个指向构造函数的指针(在属性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的原型。

  
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  javascript