js中的繼承詳解

在js中實現的繼承的方法可以有多種,除了原型繼承之後,還可以使用借用、僞造構造函數的方法實現繼承等等。接下來我們就詳細的介紹一下這幾種方式。

1.js中的原型繼承

關於原型繼承的內容其實在上一篇博客中已經介紹過,這裏就只說一下它的實現方式,關於其他的內容就不過多重複了。
在js中實現原型繼承的方式是借用構造函數的原型和實例來實現:
	<script type="text/javascript">
		function Person(name,age){
			this.name=name;
			this.age=age;
		}
		function Teacher(name,sex){
			this.name=name;
			this.sex=sex;
		}
		Person.prototype.show="kk";
		//實現原型繼承
		Teacher.prototype=new Person();
		var t1=new Teacher("aa","男");
		//使用Person原型中的屬性
		console.log(t1.show);
	</script>
這種方式就是基於原型實現的繼承,但是原型繼承有一個很大的缺點,就是沒有辦法使用上級函數的私有屬性邏輯,並且上級函數的私有屬性也會進入到下級函數的原型中,從而可能會出現undefined的情況

2.借用、僞造構造函數的方式實現繼承

其實這種實現繼承的方式是藉助call,apply函數來實現的繼承,具體如下面的代碼:
	<script type="text/javascript">
		function Person(name,age){
			this.name=name;
			this.age=age;
		}
		function Teacher(sex,name,age){
			Person.call(this,name,age);
			this.sex=sex;
		}
		var t1=new Teacher("男","cc",30);
		console.log(t1.sex);
		console.log(t1.name);
		console.log(t1.age);
	</script>
這就是使用借用的方式實現的繼承,這種方式和原型繼承相比可以使用上級函數的私有屬性啦,但是不能使用上級函數原型中的屬性和方法。

3.總結比較兩種繼承方法

原型繼承:原型繼承是通過函數原型和實例的方式實現的繼承,可以使用上級函數原型中的內容,但是不能使用上級函數的私有屬性邏輯,並且上級函數的私有屬性會傳遞到下級函數的原型,會造成undefined的情況
借用、僞造繼承:使用call或者apply函數實現的繼承可以使用上級函數的私有屬性,但是不能夠實現上級函數原型中的內容,並且還可以實現多繼承。

4.基於這兩種方式實現的繼承--組合方式繼承

	<script type="text/javascript">
		function Person(name,age){
			this.name=name;
			this.age=age;
		}
		function Teacher(sex,name,age){
			Person.call(this,name,age);
			this.sex=sex;
		}
		Person.prototype.show="kk";
		Teacher.prototype=new Person();
		var t1=new Teacher("男","cc",30);
		console.log(t1.sex);
		console.log(t1.name);
		console.log(t1.age);
		console.log(t1.show);
	</script>
兩種實現繼承的方式結合在一起,這樣的話就具有了上面兩種方式共同的優點
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章