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__指向創建自己的構造函數的原型對象。可以使用這個原型對象里面的屬性和方法。那么接下來我們用一個栗子和內存圖來表示