面向對象的程序設計

你們好,我是蘇日儷格,本文是面向對象的第三部分,純屬我的理解,有哪裏不對的地方請在評論區指出,你們一塊兒學習共同進步。瀏覽器

想要知道__proto__& prototype的關係,就得先了解這兩者分別是什麼?函數

__proto__

  • 它是一個隱式原型
  • 是由於JavaScript對象都有一個內置屬性[[prototype]],瀏覽器正是經過__proto__來訪問的,所以每一個對象身上也就有了這個隱式原型
  • 一個對象的隱式原型指向構造該對象的構造函數的原型:(new Object()).__proto__ === Object.prototype學習

    顯式原型的做用:用來實現基於原型的繼承與屬性的共享。
    隱式原型的做用:構成原型鏈,一樣用於實現基於原型的繼承。舉個例子,當咱們訪問obj這個對象中的x屬性時,若是在obj中找不到,那麼就會沿着__proto__依次查找。this

    prototype

  • 它是一個顯式原型
  • 函數身上都有顯式原型和隱式原型(萬物皆對象,函數也是對象),而且函數的這個原型屬性也是一個指針,指向該函數的原型對象,所謂原型對象就是包含了全部實例的共享的方法和屬性的對象
  • 它都有一個constructor指向自身,除了改變this指向狀況以外
  • 若是子類的原型等於父類的實例,因爲父類的實例是一個對象,對象只有__proto__,那麼子類的原型也只有__proto__屬性,由於父類實例的__proto__指向父類構造的原型,因此子類的原型的__proto__就等於父類構造的原型prototype

    __proto__& prototype的關係
    隱式原型指向建立該對象的構造函數的顯式原型

謹記二者的特色和關係,由於原型鏈的原理就是創建在這基礎上的,若是這裏理解不了,那麼整個面向對象的部分就全垮掉了,爲了幫助碼農們更好地理解,我把在網上找到的這個小可愛給你們獻上來:指針

這個圖片看似凌亂,其實這塊的原理都在這個圖上充分的展示了,根據這幅圖再配上點文字的輔助,給你們呈現如下內容:
圖中就是利用構造函數建立多個對象的過程,Foo構造函數的原型屬性prototype指向了原型對象Foo.prototype,在原型對象裏有全部構造函數建立的實例的共享的方法和屬性,而該原型對象的constructor又指向了構造函數自己,全部實例(f1和f2)的隱式原型指針都指向了構造函數的原型對象,這樣實例就能夠訪問原型對象的所有方法和屬性了;而Foo除了是一個函數以外也是一個對象,所以就有了一個__proto__屬性,該屬性是一樣的道理,指向了該函數的構造函數的原型對象(即Function.prototype),Object()依然是這個道理,全部對象的祖宗歸根到底還不是Object嘛,所以最上層就是Object,在往上就是null,這個理解了,那原型鏈也就迎刃而解了code

若是到如今對原型鏈仍是有些模糊的話,讓咱們來看一個原型鏈的例子吧:對象

function Person(){}
function Father(){}
Father.prototype = new Person();
function Child(){}
Child.prototype = new Father();
let child = new Child();
console.log(child);

控制檯:blog

Child的[[prototype]]的最外層就是Object,Object.__proto__就是null,這就是原型鏈,這也證明了Person的原型的constructor就是它自己繼承

原型鏈咱們也懂了,看一看實現對象繼承的幾種方法吧
本文的全部內容均是一字一句敲上去的,但願你們閱讀完本文能夠有所收穫,由於能力有限,掌握的知識也是不夠全面,歡迎你們提出來一塊兒分享!謝謝O(∩_∩)O~

個人簡書:https://www.jianshu.com/u/72f239ec5d03
等一下( •́ .̫ •̀ ),我還有最後一句話:
我愛你,
也許你是我前世一直沒法破解的棋局,
是我此生永遠不能猜透的謎底,
一念起,
萬水千山皆有情 ,
一念滅,
滄海桑田已無意 ,
再見...

相關文章
相關標籤/搜索