1. 程式人生 > 實用技巧 >【面向物件】【prototype __proto__ 例項化物件 三者之間的關係】 (四)

【面向物件】【prototype __proto__ 例項化物件 三者之間的關係】 (四)

1、建構函式

a、什麼是建構函式?
     解釋:通過關鍵字new 建立的函式叫做建構函式
     作用:用來建立一個物件

廢話少說直接上程式碼,首先我們還是建立一個建構函式人類

然後我們在建立兩個例項,一個凡塵 一個吳彥祖!畢竟只有我們2個人的顏值可以進行匹配


我們可以看到凡塵和彥祖都有一個屬性name和一個方法eat;那麼我們簡單思考一下,因為凡塵和彥祖都是通過建構函式new Person創建出來的,那麼他們倆個的eat方法是否相等?

 

列印結果是false.為什麼會是false? 這個時候就不得不說一個經典的面試題了!!! 當建立建構函式的時候js執行了哪些操作?
1、在記憶體中開闢了一塊空間 2、把this指向了當前物件 通過這個面試題就可想而知為什麼不相等了,地址的指向都不相同了還指望他們相同嗎?如果還不理解我們還可以舉一個通俗易懂的栗子,假設你和隔壁老王都有一個孩子,你們有一個公共的方法“教育孩子”,你可以想象一個你和隔壁老王的孩子都不在一起,倆的教育方法名字雖然相同,但是你能指望老王教育出來的孩子和你教育出來的孩子能夠一模一樣?別天真了孩子,要是都一樣的話那麼這個世界上就沒有忠孝禮義廉了 那麼問題來了我們如何才能讓他們兩個的方法都相等呢?也就是說如何才能讓他們都呼叫同一個方法,畢竟每次都呼叫不同的方法多麼浪費記憶體!!!! 那麼我們可不可以這樣將這個方法寫在物件外面讓他們呼叫的這個方法地址執行外面的這個函式?

貌似可以!!!但是如果要是有多個方法的時候該怎麼辦?難到我需要在外面定義多個全域性函式嗎?畢竟我們主張的是儘量減小全域性變數和全域性函式,第一是為了防止變數名的衝突。第二也是為了初學者的詞彙量著想 第三也是為了防止變數的汙染 難到就沒有什麼完美的解決方案嗎? 那下面就不得不說下我們偉大的原型prototype

2、原型prototype

1、什麼是prototype?
     a、prototype是每一個函式自帶的一個屬性
     b、prototype屬性指向一個物件,簡稱原型。所有prototype稱為原型

2、原型有什麼作用?
     1、節約記憶體

     2、擴充套件屬性和方法

     3、可以實現類的繼承

3、接下來我們建立2個函式,來檢視函式裡面是否有prototype這個屬性

從以上例子中我們可以更加肯定每一個函式都有一個prototype屬性而這個屬性指向一個object。如果prototype指向一個物件的話那麼我們自然就可以給它新增屬性和方法了

4、如何在prototype原型上面新增屬性和方法?

5、因為這個方法是在建構函式Person的原型上新增的,因此當每次例項化一個物件的時候,每個物件都有這樣一個方法,而且都是呼叫的同一個方法

6、那麼接下來我們看下我們加在原型上面的這個方法在這個例項化物件的哪裡放著。

我們可以清晰的看到我們例項化出來的物件,這個eat方法在__proto__裡面放著,而這個__proto__同樣也指向了一個物件。那麼我們就不得不思考下建構函式的prototype與例項化物件裡面的__proto__是否是同一個東西

7、建構函式的prototype與例項化__proto__之間的關係

不比較不知道,一比較嚇一跳。他們不僅發現裡面的東西相同,而且判斷結果也相同。而且你會發現你通過原型prototype新增的方法在__proto__裡面也會出現。換句話說也就是__proto__可以訪問prototype裡面的所有屬性和方法

3、prototype--->__proto__---->例項化物件三者之間的關係

1、prototype總結

     解釋:每一個函式都有一個prototype這個屬性,而這個屬性指向一個物件,我們簡稱原型
     
     作用:
          1、節約記憶體

          2、擴充套件屬性和方法

          3、可以實現類之間的繼承

2、__proto__總結
     1、每一個物件都有一個__proto__屬性

     2、 __proto__指向建立自己的那個建構函式的原型

     3、物件可以直接訪問自己__proto__裡面的屬性和方法

3、constructor總結
     constructor指向建立自己的那個建構函式


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

當我們建立一個建構函式的時候這個建構函式自帶了一個prototype屬性,而這個屬性指向一個物件,也就是原型物件。這個原型物件裡面有一個constructor構造器,它的作用是指向建立自己的建構函式。除此之外prototype還可以存放公共的屬性和方法。當我們例項化一個物件的時候,這個物件自帶了一個__proto__屬性,這個__proto__指向建立自己的建構函式的原型物件。可以使用這個原型物件裡面的屬性和方法。那麼接下來我們用一個栗子和記憶體圖來表示