【面向對象】----【prototype&&__proto__&&實例化對象三者之間的關係】(四)(轉載自個人老師 Alley-巷子)

一、構造函數面試

複製代碼
a、什麼是構造函數?
     解釋:經過關鍵字new 建立的函數叫作構造函數
     做用:用來建立一個對象

廢話少說直接上代碼,首先咱們仍是建立一個構造函數人類

 

而後咱們在建立兩個實例,一個凡塵 一個吳彥祖!畢竟只有咱們2我的的顏值能夠進行匹配
 
  
 

 

 

 咱們能夠看到凡塵和彥祖都有一個屬性name和一個方法eat;那麼咱們簡單思考一下,由於凡塵和彥祖都是經過構造函數new Person建立出來的,那麼他們倆個的eat方法是否相等?

 

打印結果是false.爲何會是false? 這個時候就不得不說一個經典的面試題了!!!
 
當建立構造函數的時候js執行了哪些操做?
一、在內存中開闢了一塊空間
二、把this指向了當前對象
 
經過這個面試題就可想而知爲何不相等了,地址的指向都不相同了還期望他們相同嗎?若是還不理解咱們還能夠舉一個通俗易懂的栗子,假設你和隔壁老王都有一個孩子,大家有一個公共的方法「教育孩子」,你能夠想象一個你和隔壁老王的孩子都不在一塊兒,倆的教育方法名字雖然相同,可是你能期望老王教育出來的孩子和你教育出來的孩子可以如出一轍?別天真了孩子,要是都同樣的話那麼這個世界上就沒有忠孝禮義廉了
 
那麼問題來了咱們如何才能讓他們兩個的方法都相等呢?也就是說如何才能讓他們都調用同一個方法,畢竟每次都調用不一樣的方法多麼浪費內存!!!!
 
 
 
那麼咱們可不能夠這樣將這個方法寫在對象外面讓他們調用的這個方法地址執行外面的這個函數?

 

 

貌似能夠!!!可是若是要是有多個方法的時候該怎麼辦?難到我須要在外面定義多個全局函數嗎?畢竟咱們主張的是儘可能減少全局變量和全局函數,第一是爲了防止變量名的衝突。第二也是爲了初學者的詞彙量着想 第三也是爲了防止變量的污染
 
難到就沒有什麼完美的解決方案嗎?
那下面就不得不說下咱們偉大的原型prototype
複製代碼

 

二、原型prototype函數

複製代碼
一、什麼是prototype?
     a、prototype是每個函數自帶的一個屬性
     b、prototype屬性指向一個對象,簡稱原型。全部prototype稱爲原型

二、原型有什麼做用?
     一、節約內存

     二、擴展屬性和方法

     三、能夠實現類的繼承

三、接下來咱們建立2個函數,來查看函數裏面是否有prototype這個屬性

從以上例子中咱們能夠更加確定每個函數都有一個prototype屬性而這個屬性指向一個object。若是prototype指向一個對象的話那麼咱們天然就能夠給它添加屬性和方法了this

 

四、如何在prototype原型上面添加屬性和方法?spa

 

 

五、由於這個方法是在構造函數Person的原型上添加的,所以當每次實例化一個對象的時候,每一個對象都有這樣一個方法,並且都是調用的同一個方法prototype

 

 六、那麼接下來咱們看下咱們加在原型上面的這個方法在這個實例化對象的哪裏放着。3d

咱們能夠清晰的看到咱們實例化出來的對象,這個eat方法在__proto__裏面放着,而這個__proto__一樣也指向了一個對象。那麼咱們就不得不思考下構造函數的prototype與實例化對象裏面的__proto__是不是同一個東西code

 

七、構造函數的prototype與實例化__proto__之間的關係對象

不比較不知道,一比較嚇一跳。他們不只發現裏面的東西相同,並且判斷結果也相同。並且你會發現你經過原型prototype添加的方法在__proto__裏面也會出現。換句話說也就是__proto__能夠訪問prototype裏面的全部屬性和方法blog

複製代碼

 三、prototype--->__proto__---->實例化對象三者之間的關係繼承

複製代碼
一、prototype總結

     解釋:每個函數都有一個prototype這個屬性,而這個屬性指向一個對象,咱們簡稱原型
     
     做用:
          一、節約內存

          二、擴展屬性和方法

          三、能夠實現類之間的繼承

二、__proto__總結
     一、每個對象都有一個__proto__屬性

     二、 __proto__指向建立本身的那個構造函數的原型

     三、對象能夠直接訪問本身__proto__裏面的屬性和方法

三、constructor總結
     constructor指向建立本身的那個構造函數


接下來咱們說說三者之間的關係。

當咱們建立一個構造函數的時候這個構造函數自帶了一個prototype屬性,而這個屬性指向一個對象,也就是原型對象。這個原型對象裏面有一個constructor構造器,它的做用是指向建立本身的構造函數。除此以外prototype還能夠存放公共的屬性和方法。當咱們實例化一個對象的時候,這個對象自帶了一個__proto__屬性,這個__proto__指向建立本身的構造函數的原型對象。可使用這個原型對象裏面的屬性和方法。那麼接下來咱們用一個栗子和內存圖來表示

 

 
複製代碼
相關文章
相關標籤/搜索