最近在找工做,被問及一些繼承、原型鏈什麼的問題,這些東西一年前就應該研究透徹,老夫倒是學得七雜八雜且把這些東西過目便忘,並未對本該瞭解的東西深刻的研究。以此警示本身,這兩天把這些仔細的過一遍。看了一下別人的,略有所得,也有些本身不一樣的看法。javascript
//定義動物類 function Animal (name,action,status) { // 屬性 this.name = name || '未知生物'; console.log("這是一隻"+this.name); // 實例方法 this.rest= function () { console.log(this.name + (action || '休息中')+(status || '吃肉')); } }
// 定義一個動物類 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
// 定義一個動物類 function tigger() { } //原型指向父類 tigger.prototype = new Animal() new tigger()
特色: 將父類的實例做爲子類的原型,共享引用屬性spa
優勢:簡單易實現prototype
缺點:只能實現單繼承;建立子類實例時, 沒法向父類構造函數傳參rest
// 定義一個動物類 function tigger(type,name,action,status) { var a = new Animal(name,action,status); a.name2 = type; return a } tigger()
特色:引入父類的實例,在其基礎上修改或增減屬性、方法。code
優勢:可修改屬性、方法。繼承
缺點:只能實現單繼承;事件
// 定義一個動物類 function tigger(name,action,status) { Animal.call(this,name,action,status) } tigger.prototype = new Animal(); new tigger()
特色: 構造繼承與原型鏈繼承組合使用,繼承父類的屬性與方法的同時也繼承父類原型的屬性和方法,。
優勢:可傳參數 ; 多繼承;公有屬性與私有屬性都具備;
缺點:調用兩次構造函數,浪費內存。
// 定義一個動物類 function tigger(name,action,status) { // 構造繼承 Animal.call(this); } Object.assign(tigger.prototype,Animal.prototype)
特色: 將父類的方法、屬性與父類原型的方法、屬性分開繼承;注意:assign爲ES6的方法。
優勢:具備組合繼承特色的同時不用調用兩次實例,並未浪費內存;
缺點:不能繼承父類原型的原型的方法和屬性,且assign爲ES6的方法。