面向对象的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默认的原型)----------------|
---------------->superObj----
| | prototype改写
| |
| -----------Sub prototype(Sub默认的原型,并没有使用)
-----------------subObj
虚线部分就是原型链,有兴趣的同学可以在添加继承关系