JavaScript中繼承的方式主要有3種;javascript
第一種:原型鏈繼承,經過將子元素的原型指向父元素的實例對象來實現繼承 ;java
缺點:字面量重寫原型會中斷關係,使用引用類型的原型,而且子類型還沒法給超類型傳遞參數函數
第二種:借用構造函數繼承,經過繼承父元素的構造函數,來繼承其構造函數中聲明的一些屬性和方法;學習
缺點:借用構造函數雖然解決了剛纔兩種問題,但沒有原型,則複用無從談起。因此咱們須要原型鏈+借用構造函數的模式,這種模式稱爲組合繼承測試
第三種:原型鏈+構造函數,在原型中處理方法,在構造函數中處理屬性。this
優勢:組合式繼承是比較經常使用的一種繼承方法,其背後的思路是 使用原型鏈實現對原型屬性和方法的繼承,而經過借用構造函數來實現對實例屬性的繼承。這樣,既經過在原型上定義方法實現了函數複用,又保證每一個實例都有它本身的屬性。prototype
備註:放在代碼段裏是爲了方便測試和學習code
//(1)原型鏈 function Animal(name,age) { this.name = name; this.age = age; }; Animal.prototype.sayHello = function () { alert('hello'); }; function Dog(name,age) { //(2)借用構造函數 Animal.call(this,name,age); } Dog.prototype = new Animal(); Dog.prototype.run = function () { alert(this.name); } var dog = new Dog('huahua',2); console.log(dog); dog.sayHello(); dog.run(); //1)經過原型來實現繼承時,原型實際上會變成另外一個類型的實例,原來的實例屬性也就變成了如今的原型屬性 // 2)在建立子類型的實例時,不能向超類型的構造函數傳遞參數。 //(3)僞經典繼承 // 將原型鏈和借用構造函數的技術組合在一塊兒。 // 原理是:使用原型鏈實現對原型屬性和方法的繼承,而經過借用構造函數實現對實例屬性的繼承。
繼承關係圖:對象