當前位置:
首頁 > 知識 > 「js高手之路」從原型鏈開始圖解繼承到組合繼承的產生

「js高手之路」從原型鏈開始圖解繼承到組合繼承的產生

於javascript原型鏈的層層遞進查找規則,以及原型對象(prototype)的共享特性,實現繼承是非常簡單的事情

一、把父類的實例對象賦給子類的原型對象(prototype),可以實現繼承

「js高手之路」從原型鏈開始圖解繼承到組合繼承的產生

通過把父類(Person)的一個實例賦給子類Teacher的原型對象,就可以實現繼承,子類的實例就可以訪問到父類的屬性和方法

「js高手之路」從原型鏈開始圖解繼承到組合繼承的產生

第11行,執行oT.userName, 首先去oT對象上查找,很明顯oT對象上沒有任何屬性,所以就順著oT的隱式原型__proto__的指向查找到Teacher.prototype,

發現還是沒有userName這個屬性,繼續沿著Teacher.prototype.__proto__向上查找,找到了new Person() 這個實例上面有個userName,值為ghostwu

所以停止查找,輸出ghostwu.

第12行,執行oT.showUserName前面的過程同上,但是在new Person()這個實例上還是沒有查找到showUserName這個方法,繼續沿著new Person()的

隱式原型__proto__的指向( Person.prototype )查找,在Person.prototype上找到了showUserName這個方法,停止查找,輸出ghostwu.

二、把父類的原型對象(prototype)賦給子類的原型對象(prototype),可以繼承到父類的方法,但是繼承不到父類的屬性

「js高手之路」從原型鏈開始圖解繼承到組合繼承的產生

三、發生繼承關係後,實例與構造函數(類)的關係判斷

還是通過instanceof和isPrototypeOf判斷

「js高手之路」從原型鏈開始圖解繼承到組合繼承的產生

四,父類存在的方法和屬性,子類可以覆蓋(重寫),子類沒有的方法和屬性,可以擴展

「js高手之路」從原型鏈開始圖解繼承到組合繼承的產生

五、重寫原型對象之後,其實就是把原型對象的__proto__的指向發生了改變

原型對象prototype的__proto__的指向發生了改變,會把原本的繼承關係覆蓋(切斷)

「js高手之路」從原型鏈開始圖解繼承到組合繼承的產生

上例,第7行,Teacher.prototype重寫了Teacher的原型對象(prototype),原來第6行的原型對象的隱式原型(__proto__)指向就沒有作用了

所以在第14行,oT.showUserName() 就會發生調用錯誤,因為Teacher的原型對象(prototype)的隱式原型(__proto__)不再指向父類(Person)的實例,繼承關係

被破壞了.

六、在繼承過程中,小心處理實例的屬性上引用類型的數據

「js高手之路」從原型鏈開始圖解繼承到組合繼承的產生

oT1的skills添加了一項linux數據,其他的實例都能訪問到,因為其他實例中共享了skills數據,skills是一個引用類型

七、借用構造函數

為了消除引用類型影響不同的實例,可以借用構造函數,把引用類型的數據複製到每個對象上,就不會相互影響了

「js高手之路」從原型鏈開始圖解繼承到組合繼承的產生

雖然oT1.skills添加了一項Linux,但是不會影響oT2.skills的數據,通過子類構造函數中call的方式,去借用父類的構造函數,把父類的屬性複製過來,而且還能

傳遞參數,如第8行,但是第15行,方法調用錯誤,因為在構造中只複製了屬性,不會複製到父類原型對象上的方法

八、組合繼承(原型對象+借用構造函數)

經過以上的分析, 單一的原型繼承的缺點有:

1、不能傳遞參數,如,

Teacher.prototype = new Person();

有些人說,小括弧後面可以跟參數啊,沒錯,但是只要跟了參數,子類所有的實例屬性,都是跟這個一樣,說白了,還是傳遞不了參數

2、把引用類型放在原型對象上,會在不同實例上產生相互影響

單一的借用構造函數的缺點:

1、不能複製到父類的方法

剛好原型對象方式的缺點,借用構造函數可以彌補,借用構造函數的缺點,原型對象方式可以彌補,於是,就產生了一種組合繼承方法:

「js高手之路」從原型鏈開始圖解繼承到組合繼承的產生

子類實例oT2的skills不會受到oT1的影響,子類的實例也能調用到父類的方法.


作者:ghostwu, 出處:http://www.cnblogs.com/ghostwu 博客大多數文章均屬原創,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接,否則保留追究法律責任的權利

更多優質內容推薦:

2017優就業就業促進計劃:

http://www.ujiuye.com/zt/jycj/?wt.bd=fq37300s

學IT,用周末給自己加薪!

http://www.ujiuye.com/zt/zmb/?wt.bd=fq37300s

IT職業教育:http://xue.ujiuye.com/

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 IT優就業 的精彩文章:

Linux基礎之Linux里的循環語句
Netty SSL安全配置
記一次VS Code崩潰的解決

TAG:IT優就業 |

您可能感興趣

從繼承邁向傳承
C++繼承:繼承與構造函數、派生類到基類的轉換
「根基在繼承傳統,關鍵在融合創新」
C 語言 繼承
繼承的秘密:房屋繼承指的是什麼?
東方月初的髮型不是繼承於秦蘭,是繼承於出場幾秒的他
公有繼承,私有繼承,保護繼承的區別
父母遺產繼承的順序
「健康」旗手王宜:在繼承創新的路上不懈奮進
Swift 繼承
把日本的技術遺產繼承到未來去
Reddit: 繼承財產後受到的騷擾
趣談嫡長子繼承製、草原部落的幼子繼承製及古希臘的長子繼承製
筆法的繼承與衍生
vivo NEX將迎繼承新品?雙面屏神似努比亞X
TVB老戲骨之子不僅繼承父業 連愛老婆都繼承了
我的英雄學院:如果不是綠谷一開始繼承OFA,這三人也能繼承
東京奧運會後郎平或將卸任?談到以後的繼承人,郎平表示不要外教
創造才是最好的繼承
從「決心」級到「繼承者」級,一文了解英國戰略核潛艇的發展史