換個角度就很好深刻理解的js繼承

有個小夥子找到我,問我說:「我看了好多遍繼承、原型鏈,可是感受仍是沒懂」
我說:「你有兒子你就懂了」
複製代碼

目錄

  • 前言
  • 什麼是Prototype
  • 什麼是原型鏈
  • 基礎結構
  • 晉升機構
  • 進階結構
  • 官方結構
  • NEW操做符
  • END

前言

最近在整理生活的過程當中,遇到了幾個問題,我身邊的大多數人是不太清楚前端是如何進階的。javascript

好比他不是很明確怎麼纔算中級工程師,怎麼纔算高級工程師,怎麼算p5,怎麼算p6。因此我在整理一份前端進階體系表(20%)。由於東西實在太多了。舉個例子,相似下面這種。前端

Reactjava

  • 初級要了解裏面生命週期 一些api,一些特性 組件化開發面試

  • 中級要了解 diff算法 虛擬dom樹的比對,key值優化問題,render優化,context算法

  • 高級要了解 觀察者模式、setState週期運做、高階組件,反向繼承屬性代理編程

若是你以爲你須要的話,請給我留個言,好讓我提速往下寫。不然我就用別人喝咖啡的時間用來打桌球。api

在講繼承以前先搞明白幾個概念。dom

什麼是prototype

是吧,一看到這個問題就頭大。面試的時候百問不爽。 就像問你生命的起源同樣,那你就得跟他從恐龍滅絕開始講到iphone11發售。iphone

話很少說 滿分答案在此。編程語言

Javascript裏面都是對象,必須有一種機制,將全部對象聯繫起來。
因此,Brendan Eich最後仍是設計了"繼承"。
可是,他不打算引入"類"(class)的概念,由於一旦有了"類",
Javascript就是一種完整的面向對象編程語言了,這好像有點太正式了,
並且增長了初學者的入門難度。考慮到這一點,
Brendan Eich決定爲構造函數設置一個prototype屬性。
    ----感謝阮一峯老師
複製代碼

你從javascript做者創做prototype屬性的角度出發來回答這個問題,無懈可擊。

什麼是原型鏈

滿分答案

當訪問一個對象的某個屬性時,會先在這個對象自己屬性上查找,
若是沒有找到,則會去它的__proto__隱式原型上查找,
即它的構造函數的prototype,若是尚未找到就會再在構造函數
的prototype的__proto__中查找,這樣一層一層向上查找就會形
成一個鏈式結構,咱們稱爲原型鏈
複製代碼

基礎結構

咱們來縷一下邏輯,先來對比一下這個繼承的基礎結構。

我舉得例子就是生活中,你兒子繼承你的東西的流程。

  • 你有個房子,而後生了你兒子
  • 若是你想把房子繼承給你兒子使用,必須證實你兒子是你兒子
  • 因此你在你兒子出生的時候,把你兒子的名字寫在了戶口本上,證實你兒子是你兒子,而且,你兒子可使用戶口的複印件(_ proto _)能夠用戶口來使用你的房子,以及一些你兒子不知道的財產(好比三亞有套房你兒子不知道,可是若是你兒子發現了,他用戶口的複印件可使用那套房子)
  • 戶口是你的,你兒子只有使用權,戶口跟你之間有兩條線

這就是抽象的基礎結構。

晉升結構

這時,你兒子很努力的買了一輛車。而後生了個孫子。

咱們得走一下家產繼承流程

  • 你兒子把你孫子名字寫在了他的戶口本上
  • 你孫子擁有你兒子戶口本的使用權
  • 你孫子間接獲取了你戶口的使用權
  • 因此-你孫子能夠開你兒子的車,住着你的房子。
  • 你不能開你兒子的車。

這樣就能夠一代一代傳下去

進階結構

這時左邊的例子就有些抽象了,我還沒想好有什麼更貼切的形容方式。

  • 若是你這一代不是繼承父親而來的,那麼直接走祖先
  • 全部戶口本的使用權 都在 公安局檔案庫
  • 公安局檔案庫與公安局之間是兩條線

然而你們能夠看出來,咱們是能夠經過f1 間接找到 Funtion() 以及 Object() 因此會有不少隱藏的線,這些隱藏的線會經過_proto_鏈接,你們知道這些線是間接繼承先來的就能夠了。

官方結構

上面這個圖就顯示了最官方的原型鏈的結構圖,也是問我問題那個小夥子百思不得其解的,若是把這個圖抽象成家庭財產繼承問題就沒有那麼困惑了我認爲。

這麼看起來,這些箭頭指針的指向能夠鏈接成一條條「鏈子」,就是原型鏈。有點像關係拓撲圖

NEW操做符

咱們都知道NEW操做符能夠實現構造函數的繼承。 那麼new操做符的原理是什麼呢 咱們先看一下代碼部分

使用new命令時,它後面的函數依次執行下面的步驟。

  • 建立一個空對象,做爲將要返回的對象實例。
  • 將這個空對象的原型,指向構造函數的prototype屬性。
  • 將這個空對象賦值給函數內部的this關鍵字。
  • 開始執行構造函數內部的代碼。

在個人理解看來,這就是你拿着戶口本去公安局給你兒子登記的過程。

你仔細想我這句話,越想越有滋味。

END

最近在整理生活,爲何說是在整理生活,由於方方面面都須要梳理一下。 就像寫文章來講,之前我會用很長很長時間來構思文章結構,中心思路,以及傳穿針引線的知識點。後來我發現,心裏在反對這種作事節奏,首先我認爲,作事又快又好是萬物的中心思想,快節奏的世界,快餐,快手遊等,都在提速。

就像這篇文章,我寫了兩個小時多一點,可是我寫的開心的不得了,行雲流水,也會對你們有所幫助。

若是作一件事是慢的,我但願他的產出高於投入,然而寫文章這件事情,我但願能在快的基礎上,更好。

至此,給我本身敬個禮,最近辛苦了。

相關文章
相關標籤/搜索