童鞋們,咱們今天聊聊js的繼承,關於繼承,平時開發基本用不到,可是面試沒有不考的,我就想問,這是人乾的事嗎?面試
好吧,迫於社會主義核心價值觀,咱們今天就來簡單說一說js的繼承,誰讓它是面向對象編程很重要的一個方面呢編程
首先一句定義,什麼是繼承:瀏覽器
A對象經過繼承 B 對象,就能直接擁有 B 對象的全部屬性和方法。函數
常見的集成方式有六種,咱們今天依次簡單的說一下,如今讓咱們把這六種方式分一下類,大體上可分爲三類性能
第一類:普通類學習
這類繼承方法有個特性,就是簡單,容易實現,一共兩種;spa
一、原型鏈繼承prototype
關鍵點:子類型的原型爲父類型的一個實例對象,子類繼承父類的屬性和方法是將父類的私有屬性和公有方法都做爲本身的公有屬性和方法code
缺點:對象
沒法實現多繼承
來自原型對象的全部屬性被全部實例共享
建立子類實例時,沒法向父類構造函數傳參
要想爲子類新增屬性和方法,必需要在Student.prototype = new Person()
以後執行,不能放到構造器中
二、借用構造函數繼承
關鍵點:在子類型構造函數中通用call()調用父類型構造函數
缺點:
實例並非父類的實例,只是子類的實例
只能繼承父類的實例屬性和方法,不能繼承原型屬性和方法
沒法實現函數複用,每一個子類都有父類實例函數的副本,影響性能
第二類:學習進化類
這類繼承方法就比較牛了,若是說上面兩種方式都是普通型的,那接下來咱們要介紹的就是那些經過學習其餘類型身上的有點,改造本身不足的進化類型了,一共三種;
一、原型鏈+借用構造函數的組合繼承
關鍵點:經過調用父類構造,繼承父類的屬性並保留傳參的優勢,而後經過將父類實例做爲子類原型,實現函數複用
缺點:調用了兩次父類構造函數,生成了兩份實例
評價: 你看他就很牛了,他把上面的兩種普通類型結合了,造成了本身獨特的表現
二、(原型鏈+借用構造函數的組合繼承)plus
關鍵點:這種方式經過父類原型和子類原型指向同一對象,子類能夠繼承到父類的公有方法當作本身的公有方法,並且不會初始化兩次實例方法/屬性,避免的組合繼承的缺點。
缺點:沒辦法辨別是實例是子類仍是父類創造的,子類和父類的構造函數指向是同一個。
評價:這個類型就更厲害了,若是上一個類型是iPhone8,那這個就是8plus,他是在上一個版本的基礎上,又自我進化了,修補了初始化兩次實例方法和屬性這個缺點。
三、(原型鏈+借用構造函數的組合繼承)s
關鍵點:藉助原型能夠基於已有的對象來建立對象,var B = Object.create(A)
以A對象爲原型,生成了B對象。B繼承了A的全部屬性和方法。
缺點:幾乎進化到了完美形態!
評價:學習是永無止境的,蘋果公司也繼8plus以後推出了更強的手機系列,8s,又是一次進化;
第三類:天賦型
咱們要認可一件事,世上真的有天賦這個東西,接下來咱們要講的天賦型就屬於這種,它不一樣於基礎型和學習進化型,他是一種獨樹一幟的方式,而賦予它天賦的則來自ES6的class關鍵字,僅有一種;
一、ES6中class 的繼承
關鍵點:經過extends關鍵字實現繼承
缺點:它在有着以上全部優勢的前提下,存在着一個缺點,相似於慧極必傷,那就是並非全部的瀏覽器都支持class關鍵字。
OK,開始敲黑板,以上三類六種就是咱們今天要說的js繼承方法,固然三類是我胡謅的,只是但願能加深你們的理解;
JS實現繼承的幾種方式
JavaScript深刻之繼承的多種方式和優缺點
JavaScript常見的繼承方式
阮一峯ES6入門之class的繼承
JavaScript 常見的繼承方式