js奧義:原型與原型鏈(2)

回顧:上一篇講了原型對象與prototype和__proto__(傳送門 )三者之間的關係javascript

三:constructorhtml

  constructor [kənˈstrʌktə(r)] :構造器,  這是子類的__ptoto__對象和父類的prototype對象的一個屬性,它一般指向父類自己java

function Fn() {
            this.n = 20
        }
        Fn.prototype.sing = function() {
            console.log(this.n)
        }
        var deb = new Fn()
        console.log(deb.__proto__.constructor === Fn) //true
        console.log(Fn.prototype.constructor === Fn)  // true

  這也進一步證實了 ,子類的__ptoto__對象全等於父類的prototype對象!函數

  到如今,咱們已經能夠畫出一個父類,子類,與prototype三者的關係圖學習

 

 

上圖是學習原型鏈的基礎。 this

在這張圖中:prototype

  prototype對象 :prototype是父類的一個屬性,因爲它的值是一個對象類型,於是它既能夠看做是父類的屬性,也能夠認爲是父類的一個隱式的對象,全部的函數都有一個prototype對象 !3d

         原型對象有一個constructor屬性,它指向了父函數自己。父函數也能夠經過自身的prototype屬性找到這個原型對象;由這個父級實例的對象也能夠經過__proto__屬性htm

         找到這個原型對象。對象

  父級:因爲父級是一個構造函數,它使用new關鍵字實例了子類,於是咱們能夠認爲,父級使用new關鍵字和子類產生了聯繫。同時,子類也能夠經過__proto__對象的constructor找到自身的父級,這是

     因爲自身的__proto__就是父級的prototype對象,本質上 是先經過__proto__屬性找到父級的prototype對象,再經過prototype對象的constructor指向找到 其父級

  __proto__: 結合上一篇,__proto__屬性隱式存在於每個obj對象身上,而prototype的值也是對象類型,這也說明,任何父類的prototype對象也都有一個__proto__屬性!

       子類的__proto__其實就是一條鎖鏈,指向其父類的prototype對象,咱們也能夠得出一條結論:全部對象的__proto__都指向它的父類的prototype對象!

 

  

 

 

 

 

 

 基於constructor,咱們經過在原型對象的__proto__對象的constructor屬性指向能夠得知,原型對象的__proto__指向了Object.prototype . 

(Object對象是全部對象的共有父類,而對象的__proto__屬性則指向它的構造函數的prototype對象!)

        console.log(deb.__proto__.__proto__ === Object.prototype) //true

  這句話的理解是:「對象的原型對象的原型對象是Object的原型嗎」 

舉個栗子:

  小明有爸爸媽媽,也有爺爺奶奶和外公外婆,有天他問媽媽:」 你的媽媽的媽媽是誰?「,媽媽指着外婆,告訴他:」個人媽媽是xxx,她是你的外婆「,而後小明的媽媽問外婆:」個人媽媽的媽媽是誰呢?「

  外婆指着天空說:」 我沒有媽媽.「

  在這個例子裏,假設全部人都有一個紐帶(__proto__),用於指明本身的親人,小明是一個對象(son),他用本身的紐帶(son.__proto__)找到了本身的媽媽(son.__proto__),也就是prototype,

  而後他想知道本身的 外婆是誰,他的媽媽經過用本身的紐帶(prototype.__proto__)告訴他,他的外婆是xxx(Object.prototype),而後媽媽也想知道本身的外婆(prototype.proto.proto)是誰,外婆經過本身的紐帶 (Object.prototype.__proto__)想回答這個問題,但是沒找到,因而告訴媽媽,什麼都沒有(null)

這雖是個簡單的例子,卻深入說明了一個原理:

    1.全部的對象都有一個__proto__屬性,這個屬性指向了本身父級的原型對象,

    2.Object對象是全部對象的共有父類

    3.Object對象的原型對象的__proto__是null

圖解:

 

 

 

 這種經過原型鏈方式將原型對象與對象之間連接的 關係咱們就叫作原型鏈。

以上。

相關文章
相關標籤/搜索