簡單理解JavaScript原型鏈

簡單理解原型鏈

  • 什麼是原型 ?

我是這樣理解的:每個JavaScript對象在建立的時候就會與之關聯另一個特殊的對象,這個對象就是咱們常說的原型對象,每個對象都會從原型「繼承」屬性和方法。數據結構

  • 什麼是原型鏈 ?

一個由有限個原型對象組成的用來實現繼承和共享屬性的對象鏈。函數

打個通俗的比方,能夠把原型鏈理解成一個家族的血親關係,每個後代都會從父代身上繼承該家族特有的基因和特徵。prototype

  • 什麼是"繼承" ?

關於原型的繼承,咱們常說每個對象都會從原型上"繼承"屬性,實際上,此"繼承"並不是意味着簡單的複製,而是一個可訪問的通道,引用《你不知道的JavaScript》中的一句話:指針

繼承意味着複製操做,然而JavaScript默認並不會複製對象的屬性,相反,JavaScript只是在兩個對象之間建立一個關聯,這樣,一個對象就能夠經過委託訪問另外一個對象的屬性和函數,因此與其說是繼承,委託的說法反而更加準確。code

三個概念

prototype

  • 構造函數特有的屬性
  • 指向一個原型對象,對象存儲了要共享給實例的屬性和方法

_proto_

  • 實例對象的一個指針屬性
  • 指向上層構造函數對應的prototype,即本身的原型對象

constructor

  • 原型對象的一個屬性
  • 指向原型對象的構造函數
  • 經過new建立實例時,對象會繼承該屬性

對象的原型鏈

Object

  • 做爲對象:Object.__proto__ = Function.prototype
  • 做爲函數:Object.prototype是原型鏈的頂端,Object.prototype.__proto__ = null

Function

  • 做爲對象:Function.__proto__ = Function.prototype
  • 做爲函數:Function.prototype用於共享,而Function.prototype__proto__繼承自Object.prototype

Array

  • 做爲對象:Array.__proto__ = Function.prototype
  • 做爲函數:Array.prototype用於共享,Array.prototype.__proto__繼承自Object.prototype

Person

  • 做爲對象:Person.__proto__ = Function.prototype對象

  • 做爲函數:Person.prototype用於共享,Person.prototype.__proto__繼承自Object.prototype繼承

    原型鏈關係:ip

核心

  1. 原型鏈頂端是Object.prototype原型鏈

  2. JavaScript原生對象(Object、Function、Array等)都是Function的實例,它們的__proto__均指向Function.prototype原型

  3. 除了Object,全部原生對象(構造函數)的prototype,均繼承自Object.prototype

  4. JavaScript數據結構

    JavaScript數據結構和原型鏈之間的關係以下圖:

相關文章
相關標籤/搜索