JS 繼承

最近在找工做,被問及一些繼承、原型鏈什麼的問題,這些東西一年前就應該研究透徹,老夫倒是學得七雜八雜且把這些東西過目便忘,並未對本該瞭解的東西深刻的研究。以此警示本身,這兩天把這些仔細的過一遍。看了一下別人的,略有所得,也有些本身不一樣的看法。javascript

繼承 基於構造函數    

//定義動物類
function Animal (name,action,status) {
	// 屬性
	this.name = name || '未知生物';
	console.log("這是一隻"+this.name);
	// 實例方法
	this.rest= function () {
		console.log(this.name + (action || '休息中')+(status || '吃肉'));
	}
}

 

1、構造繼承

// 定義一個動物類
function tigger(name,action,status) {
    Animal.call(this,name,action,status)
}
new tigger("老虎");
console.log(new tigger("老虎").name)
new tigger("老虎","跳躍","咬蚊子").rest();
//不使用屬性、方法的時候能夠不用new
tigger("老虎");

特色: 將父類的方法、屬性放到子類使用;若是隻用到父類包含的事件而不用其屬性、方法能夠不用new。java

優勢:建立實例時,可向父類傳遞參數 ; 能夠實現多繼承函數

缺點:只能繼承父類的實例的屬性和方法, 沒法繼承父類的原型的屬性和方法;this

2、原型鏈繼承

// 定義一個動物類
function tigger() {

}
//原型指向父類
tigger.prototype = new Animal()
new tigger()

特色: 將父類的實例做爲子類的原型,共享引用屬性spa

優勢:簡單易實現prototype

缺點:只能實現單繼承;建立子類實例時, 沒法向父類構造函數傳參rest

3、實例繼承

// 定義一個動物類
function tigger(type,name,action,status) {
	var a = new Animal(name,action,status);
		a.name2 = type;
		
	return a
}
tigger()

特色:引入父類的實例,在其基礎上修改或增減屬性、方法。code

優勢:可修改屬性、方法。繼承

缺點:只能實現單繼承;事件

4、組合繼承

// 定義一個動物類
function tigger(name,action,status) {
    Animal.call(this,name,action,status)
}
tigger.prototype = new Animal();
new tigger()

特色:  構造繼承與原型鏈繼承組合使用,繼承父類的屬性與方法的同時也繼承父類原型的屬性和方法,。

優勢:可傳參數 ; 多繼承;公有屬性與私有屬性都具備;

缺點:調用兩次構造函數,浪費內存。

5、寄生式組合繼承

// 定義一個動物類
function tigger(name,action,status) {
	// 構造繼承
	Animal.call(this);
}
Object.assign(tigger.prototype,Animal.prototype)

特色:  將父類的方法、屬性與父類原型的方法、屬性分開繼承;注意:assign爲ES6的方法

優勢:具備組合繼承特色的同時不用調用兩次實例,並未浪費內存

缺點:不能繼承父類原型的原型的方法和屬性,且assign爲ES6的方法

相關文章
相關標籤/搜索