原型:每一个对象都有一个属性叫_proto_;这个属性就是这个对象的原型;
prototype和_proto_的区别:
prototype是函数才有的属性;
_proto_是每个对象都有的属性;
原型链:
js里面万物皆对象,形成一条_proto_连起来的链条,递归访问_proto_最终到头,最终值为null;
js引擎查找对象时,先查找对象本身是否存在该属性,不存在,在原型链中查找,不会查找自身的prototype;
如下图所示:
例:
<script type="text/javaScript">
var o = { name:"我是祖宗"};
var f1 = function(){
this.name = "我是亚当";
};
f1.prototype = o;
var foo1 = new f1();
var f2 = function() {
this.name = "夏娃";
}
var foo2 = new f2();
foo2._proto_ = foo1;
var f3 = function() {
this.name = "我是人类";
};
f3.prototype = foo2;
var foo3 = new f3();
alert(foo3.name);
结果是:我是人类;
如果没有"我是人类",则输出结果为"夏娃";
每个对象都有一个__proto__,它指向它的prototype原型对象,而prototype原型对象又具有一个自己的prototype原型对象,就这样层层往上直到一个对象的原型prototype为null这个查询的路径就是原型链;