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默认的原型)----------------