1. 程式人生 > >JS繼承(一)

JS繼承(一)

傳播 引用類型 ror show 最終 指點 tor 繼承 分享圖片

突然發現自己很久沒寫過什麽東西了

其實從博客更新的速度上就可以看出一個人近期有沒有成長

對 …… 我沒有成長

也可以由此看出自己選擇的企業是不是對的

對 …… 我不會離職……

略略略 來咬我啊……

於是乎 我把自己以前其他博客發的文章放出來了

歡迎騷擾 歡迎指點 小女子 不勝感激……

——————————————我是分割線————————————————

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的sayA方法 可以執行
因為b1沿著prototype屬性可以訪問B.prototype ,B.prototype可以繼續沿著prototype屬性訪問 A.prototype,最終在A.prototype上找到 了sayA方法 所以可以執行 所以現在的結果就相當於 b1繼承了A的屬性和方法 這種由prototype不斷把實例和原型對象聯系起來的結構就是原型鏈 也是js中 繼承主要的實現方式 該篇文章參考思否! 主要方便自己記憶的同時 傳播 好的內容 !希望對大家有所幫助!

JS繼承(一)