讀者朋友們你們好,咱們今天這一講就接着前面的封裝繼續講解,今天就是在前面內容上面的升級,OOP思想中的繼承,咱們就先來解釋一下繼承究竟是什麼意思,咱們在什麼地方會用到繼續。javascript
繼承就是,後代繼續祖先的一系列屬性,行爲。後代仍然算是與祖先同族,下面咱們再用一些具體描述,來理解一下什麼是繼承java
中國人,跟美國人都是 繼承自 人類祖先,因此咱們具備相同的屬性行爲,可是還有必定的差別,後面咱們們將繼續講到的多態,因此經過上面的示例圖,咱們能夠清晰的知道,人與人以前其實大同小異,因此咱們再看看下面的示例代碼,咱們就知道,用代碼來模擬繼承,咱們就又能夠知道一種方法來寫儘可能少的代碼達到作儘可能多的事。函數
//遺傳繼承函數 function Extend(Children,Parent){ //這裏僅僅只是繼承的原型連接定義的行爲 for(var p in Parent.prototype){ Children[p] = Parent.prototype[p]; } } //人類祖先 function Human(){ this.weight = "50kg"; this.height = "180cm"; this.hair = "棕色"; } //吃飯 Human.prototype.Eat = function(){ console.log("吃飯"); } //說話 Human.prototype.Say = function(){ console.log("你們好我是地球人"); } //行走 Human.prototype.Walk = function(){ console.log("我是人類,天生就能夠兩條腿直立行走"); } //繁衍 Human.prototype.Multiply = function(){ console.log("跟老婆一塊兒作羞羞的事,就是爲了人類的繁榮"); } //中國人 function Chinese(){ //調用繼承函數 Extend(this,Human); } //美國人 function American(){ //調用繼承函數 Extend(this,Human); }
咱們就這樣寫,就模擬了高級語言中的繼承,下面咱們看看運行後,有沒有問題學習
運行後,咱們發現了問題,這樣寫,咱們已經能夠實現原型連接的繼承了,並且也大大的節省了不少代碼,咱們在寫Chinese和American函數的時候,是否是隻寫了少許代碼,咱們就把父類行爲給繼承過來了,而實例也能調用父類所擁有的行爲函數,可是這樣寫,咱們尚未徹底實現繼承,由於咱們在調用hair屬性的時候就根本沒有起到做用,那麼,咱們再修改一下代碼,就能夠實現徹底繼承了this
//遺傳繼承函數 function Extend(Children,Parent){ //如今咱們是從父類實例來繼承,因此屬性和方法都會被繼承的 for(var p in Parent){ if(typeof Children[p] == "undefined"){ Children[p] = Parent[p]; } } } //人類祖先 function Human(){ this.weight = "50kg"; this.height = "180cm"; this.hair = "棕色"; } //吃飯 Human.prototype.Eat = function(){ console.log("吃飯"); } //說話 Human.prototype.Say = function(){ console.log("你們好我是地球人"); } //行走 Human.prototype.Walk = function(){ console.log("我是人類,天生就能夠兩條腿直立行走"); } //繁衍 Human.prototype.Multiply = function(){ console.log("跟老婆一塊兒作羞羞的事,就是爲了人類的繁榮"); } //中國人 function Chinese(){ //調用繼承函數 Extend(this,new Human()); } //美國人 function American(){ //調用繼承函數 Extend(this,new Human()); }
咱們仍是要看一下運行的效果是否是跟咱們想象中的同樣?spa
經過上在的代碼咱們不難看出,如今的繼承函數其實是從Human類的具體實例中複製的屬性及行爲,這樣咱們就更進一步模擬出了類的繼承,在上面有一句,我還須要給你們解釋一下prototype
if(typeof Children[p] == "undefined"){ ...... }
這裏出現的typeof關鍵字實際上是一個運算符,是查看某個變量是什麼類型,若是是未定義的狀況,運算出的結果就是 "undefined" ,因此我就是這樣比較,若是子類沒有定義過這樣的屬性或者行爲函數,那麼就從父類繼承(注:這裏的解釋是爲了後面的多態做鋪墊)。code
接下來咱們再來看一下可不能夠多重繼承,前面咱們已經提到Chinese與American兩個類都是繼承自Human類,下面咱們再寫一個類來繼承自Chinese對象
//四川人 function SiChuanMan(){ Extend(this,new Chinese()); }
如今咱們已經寫出很健壯的繼承代碼,理解也很是的簡單,只要在聲明新類的時候,在構造函數裏面調用一下繼承函數,咱們就能夠實現屬性及行爲函數的徹底繼承,這樣,咱們就能夠省下大量的代碼,OOP思想的優點再一次地被體現了出來,若是咱們要模擬中國每一個省份的人,若是我每一個省份都照着Human類的方式去寫,從太陽出來寫到次日的太陽落坡都寫不完。繼承的寫法多種多樣,每一個人都有本身的寫法,這裏,我就是以一種最簡單的方式給你們講解的,到後面你們能熟練使用時候,也能夠以本身喜歡的方式去寫,javascript自己就是一門很靈活的語言。blog
總結一下,咱們今天在封裝基礎上進一步作了升級,這樣咱們就實現了對象的繼承,書寫的代碼量被進一步被壓縮,想一想能提升工做的效率,更能提升代碼的優雅度,是否是有一點的小激動呢,只要跟着我腳步走,咱們就能夠用最簡單的方式去理解最複雜的東西,其實程序並不複雜,複雜的緣由是你們沒有獲得正確的帶領,原本很簡單的一個東西,被不一樣的人理解及解釋成不一樣的東西,這樣學習起來就複雜了,更多的是沒有連續的教程一步一步地帶領你們向正確的方向邁進,因此很長時間都很可貴到提高。