忽然發現本身好久沒寫過什麼東西了html
其實從博客更新的速度上就能夠看出一我的近期有沒有成長函數
對 …… 我沒有成長url
也能夠由此看出本身選擇的企業是否是對的prototype
對 …… 我不會離職……指針
略略略 來咬我啊……htm
因而乎 我把本身之前其餘博客發的文章放出來了 對象
歡迎騷擾 歡迎指點 小女子 不勝感激……blog
——————————————我是分割線————————————————繼承
1.構造函數,實例原型鏈
構造函數是用來建立對象的函數 與其餘函數的區別在於調用方式不一樣
- 若是經過new操做符來調用 就是構造函數
- 若是沒有經過new操做符來調用的就是普通函數
在var person1 = new person()中 經過new操做符 調用了函數person 並生成了person1
這裏的person就成爲構造函數 person1稱爲person函數對象的一個實例
其實能夠經過實例的constructor 訪問對應的構造函數 (可是其實constructor並非實例的屬性)
2.原型對象
咱們建立一個函數的時候 函數對象都會有一個prototype屬性 這個屬性是一個指針
指向他的原型對象 原型對象的本質也是一個對象
舉個栗子:
3.構造函數 原型對象和實例的關係
由圖能夠看出
- 函數對象的prototype指向原型對象 原型對象的constructor指向函數對象
- 實例對象的prototype屬性指向原型對象,這裏的perototype是內部屬性 是不容許訪問的
- 這個屬性的做用:容許實例經過該屬性訪問原型對象中的屬性和方法
解釋:console.log(person1.constructor)時說到能夠經過實例的constructor訪問構造函數
可是constructor本質上是原型對象的屬性
4.繼承
原型鏈:繼承的主要思路就事利用原型鏈
讓一個引用類型繼承另外一個引用類型的屬性和方法
- 原型對象經過contructor屬性指向構造函數
- 實例經過prototype屬性指向原型對象
原理上圖
- 首先咱們建立了A和B 兩個函數對象 同時也生成了他們的原型對象
- 接着 給A的原型對象添加了sayA()方法
- 而後是關鍵的一部B.prototype = new A();讓函數對象B的prototype指針指向了一個A的實例
這也就是爲何最後B的原型對象裏面不在有constructor屬性
(其實B原本有一個真正的原型對象 本來能夠經過B.prototype訪問 可是咱們如今改寫了這個指針
使他指向了另外一個對象,因此B真正的原型對象如今無法被訪問了 取而代之的這個新的原型對象是
A的一個實例 因此沒有了constructor屬性了)
- 接下來給這個B.prototype指向的對象增長一個sayB方法
- 而後生成了一個實例b1
- 最後調用了b1的sayB方法 能夠執行
由於b1有prorotype屬性能夠訪問B.prototype裏的方法
由於b1沿着prototype屬性能夠訪問B.prototype ,B.prototype能夠繼續沿着prototype屬性訪問 A.prototype,最終在A.prototype上找到 了sayA方法 因此能夠執行
因此如今的結果就至關於 b1繼承了A的屬性和方法 這種由prototype不斷把實例和原型對象聯繫起來的結構就是原型鏈 也是js中 繼承主要的實現方式
該篇文章參考思否! 主要方便本身記憶的同時 傳播 好的內容 !但願對你們有所幫助!