结论:
就像一个家庭中,父亲是爷爷的儿子,孩子的爸爸,妻子的丈夫一样。原型对象也是“身兼多职”的。
如果A是B new出来的,我们就称A是B的实例对象。A的隐式原型对象等价于B的显示原型对象。
下边就配合以下代码和关系图来进行简单的阐述。
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title></title>
</head>
<body>
<script type="text/javascript">
function Mali(name, color) {
this.name = name;
this.color = color;
this.eat = function(){
alert('吃')
}
}
Mali.prototype.jump = function() {
alert('跳高高')
}
Object.prototype.run = function(){
console.log('快跑')
}
var xh = new Mali("xh", 'red');
var xl = new Mali("xl", 'green')
console.log(xh)
console.log(xl)
xh.eat();
xl.jump();
xh.run();
xh.hat();
</script>
</body>
</html>
关系图
因为,xh和xl这两个实例对象是根据构造函数Mali产生的,所以xh和xl的隐式原型对象等于Mali的显示原型对象。xh._ _proto __ 全等于 Mali.prototype。就像儿子向爸爸的爸爸叫爷爷一样,都是同一个人,称为不同而已。
又因为,Mali的原型对象(暂且叫C吧)是Object对象new出来的,所以这个对象本身(C对象)也是一个实例对象。(new出来的都是实例对象)C对象的隐式原型等价与Object的显示原型对象(D对象)。
默认规定,Object的隐式对象为null。
xh.run();小红要调用run方法,因为她自身没有,所以去找她的原型对象(C对象)去找,结果C对象也没有,就继续向上找,找到了D对象,发现D对象有这个方法,所以,小红就调用了run方法。在小红寻在她需要调用的方法的过程中走的路线就叫做原型链。
如有错误,欢迎斧正;如有疑问,欢迎留言讨论。