你們好,我是蘇日儷格,本文是面向對象的第三部分,純屬我的理解,有哪裏不對的地方請在評論區指出,你們一塊兒學習共同進步。瀏覽器
想要知道__proto__& prototype的關係,就得先了解這兩者分別是什麼?函數
一個對象的隱式原型指向構造該對象的構造函數的原型:(new Object()).__proto__ === Object.prototype
學習
顯式原型的做用:用來實現基於原型的繼承與屬性的共享。
隱式原型的做用:構成原型鏈,一樣用於實現基於原型的繼承。舉個例子,當咱們訪問obj這個對象中的x屬性時,若是在obj中找不到,那麼就會沿着__proto__依次查找。this
若是子類的原型等於父類的實例,因爲父類的實例是一個對象,對象只有__proto__,那麼子類的原型也只有__proto__屬性,由於父類實例的__proto__指向父類構造的原型,因此子類的原型的__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~