原型和原型链

原型:
每个函数都会默认有一个prototype属性,它是一个指针,指向此函数的原型对象。而构造函数作为一个函数,同样拥有自己的原型对象,而通过构造函数生成的对象实例中,拥有一个_proto_ 属性,它指向构造函数的原型对象,我们把构造函数的原型对象称为对象实例的原型。

原型链:
既然每个实例对象都有一个原型,而每个构造函数也都能创建实例,那假如我们将构造函数 f1 的原型属性指向构造函数f2的实例对象,那么构造函数f1的实例对象就能访问f2的原型属性,依次类推,我们还可以把构造函数f3的原型属性指向f2的队实例对象,那么f3的实例对象同样可以访问到f1的原型,这样,就构成了一条原型链。

<!DOCTYPE html>
<html>
<head>
	<title></title>
</head>
<body>
<script type="text/javascript">
	function Person (name,age) {
		this.name = name;
		this.age = age;
		this.eat = function () {
			console.log('吃');
		};
	}
	Person.prototype.sex = '男';
	Person.prototype.sayHi = function () {
		console.log('sayHi!');
	};

	var per = new Person('小明',18);
	per.sayHi();//输出为sayHi!
	/* 
		原型的指向是可以改变的,实例对象的__proto__指向的是该对象所在的构造函数的原型对象
		构造函数的原型对象prototype的指向如果改变了,那么实例对象的原型__proto__的指向也会跟着改变,实例对象和原型对象之间的关系是通过__proto__来联系,这种关系就叫原型链
	*/
</script>
</body>
</html>

原型和原型链