原型链-----实例对象于原型之间的连接,具体含义:
利用前一章的例子
function Aaa(){ }
Aaa.prototype.num = 10;
var a1 = new Aaa();
alert( a1.num ); //10
思考一个问题,为什么对象可以找到原型下的方法,“Aaa.prototype.num= 10;”num方法应该是在Aaa.prototype下的,为什么a1也可以调用?
a1(实例)和Aaa.prototype(原型)之间有个原型链:__proto__,当在实例下找不到方法的时候通过原型链找到原型下的方法。
第二个问题,当函数Aaa内部有“this.num=20;”这时候alert的结果是20,可以得出函数内部的优先级大于原型下的优先级,可以类比成css中的class和id。它的原理其实就是实例下面已经有了num属性,调用的时候就直接返回这个num的值,因此原型下仍然拥有这个num属性就不会被查找到。
那么原型链只是实例和原型那一条链子吗?
原型链的最外层是:Object.prototype
a1.__proto__ = Aaa.prototype;
Aaa.prototype.__proto__ = Object.prototype;
function Aaa(){ }
Object.prototype.num = 30;
var a1 = new Aaa();
alert( a1.num ); //30
在a1和a1.prototype下都没num方法时,就会继续向外查找,在Object.prototype下能看到num方法。
网友评论