日期:2014-05-16  浏览次数:20316 次

javascript prototype 原型链 深入分析
面向对象的javascript编程中,我们知道,访问一个对象实例的某个属性,首先会先在这个对象中寻找,如果不存在,就在对象的原型中寻找,如果还不存在,就沿着原型链向上寻找,这里的原型链具体是怎么个形式呢,下面我们就来看看

var Super = function(){
    this.superName = "super";
}

var Sub = function(){
    this.subName = "sub";
}

var superObj = new Super();

Sub.prototype= superObj;

var subObj = new Sub();

alert(subObj.superName);


可以看到,我们定义了两个类,其中sub继承了super的superObj实例,在javascript对象中,存在三个实体,一个是定义的类,例如Super、Sub等,浏览器在实现类的定时,会自动为类天上prototype属性,这个属性会指向它对应的另一个实体prototype

prorotype实体中有两个隐藏指针,一个是constructor,指向对应类中的构造函数,里一个是__proto__,它指向javascript中的顶级父对象Obj,继承了一些共有的方法,例如isPrototypeOf

第三类实体,是对象,例如superObj和subObj,其中隐藏了一个指针,__proto__,指向类对应的prototype

所谓原型链的产生,是因为 Sub.prototype= superObj;我们将一个类的原型修改成一个对象,那么这个对象中的__proto__又指向了里一个原型,或许这个原型也是一个对象,又指向了它对应的原型,那么这样一直到底层,一个没有认为修改原型的对象,它的__proto__默认指向了Obj,这就是一条完整的原型链


我们画出上面代码中的原型链
                                                            默认的prototype中的__proto__都指向Obj
                                                      Obj<-------------------------------------------------|                           
                                                                                                                                                                                |
                                               superObj对象中的__proto__指针                                                                     |
                          Super          |---------------------------------------->prototype(Super默认的原型)----------------