js中构造函数、实例对象、原型对象之间的关系

结论:

就像一个家庭中,父亲是爷爷的儿子,孩子的爸爸,妻子的丈夫一样。原型对象也是“身兼多职”的。
如果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方法。在小红寻在她需要调用的方法的过程中走的路线就叫做原型链。

如有错误,欢迎斧正;如有疑问,欢迎留言讨论。

猜你喜欢

转载自blog.csdn.net/xiaozuo144/article/details/109862906