原型链

115 阅读1分钟

title: 技术分享篇

Welcome

原型链

原型对象

在Javascript中,万物皆对象,但对象也有区别,大致可以分为两类,即:普通对象 Object 和 函数对象 Function。

一般通过 new Function 产生的对象是函数对象,其他对象都是普通对象。

所有的对象都有(proto)属性 只有函数对象有(prototype)属性

函数对象

	function fn(){};
	var fn1=function(){};
	console.log(typeof fn);    //function 
	console.log(typeof fn1);    //function 
	console.log(typeof Object);    //function 
	console.log(typeof Array);    //function 
	console.log(typeof Date);    //function 
	......

原型对象其实就是构造函数的一个实例对象,例如人对象,相当于在person创建的时候,自动创建了一个它的实例,并且把这个实例赋值给了prototype。

	function Person(){};  
	let temp = new Person();  
	Person.prototype = temp;  

原型链

原型链是实现继承的主要方法

原型链的思路:利用原型让一个引用类型继承另一个引用类型的属性和方法。

JS通过原型链实现继承列子:

	//定义一个 Animal 构造函数
	function Animal(){
		this.type = 'Animal';	
	}
	//给 Animal 定义方法
	Animal.prototype.speack = function(){
		console.log(this.type);
	} 
	// 定义一个 Dog 对象
	function Dog(name){
		this.name = name;
		this.type = '汪汪汪';
	}
	//改变 Dog 的 prototype 指针,指向一个 Animal 实例
	Dog.prototype = new Animal();

	Dog.prototype.speak = function () {
	 	console.log(this.name+this.type+"叫");
	}

	var dog = new Dog('小黄');
	dog.speak();  //Animal 
	//输出 小黄汪汪汪叫。

这就说明,我们可以通过原型链的方式,实现 Dog 继承 Animal 的所有属性和方法。

总结来说: Dog.prototype 指向的原型对象后,实例的内部指针也发生了改变,指向了新的原型对象,然后就能实现类与类之间的继承了。(但是如果在重写原型对象之前,产生的实例,其内部指针指向的还是最初的原型对象。)