原型链(__proto__)
前面詳細的解釋了new的幾個步驟,其中隨意帶過了一下原型鏈的概念,如果細讀那篇文章,基本對原型也能有所理解。
原型有兩個關鍵屬性,一個是__proto__一個是prototype,了解了這兩個對象基本就能了解整個原型鏈的關系。
本篇主要探討一下__proto__這個屬性。
javascript中幾乎所有類型都擁有__proto__這個屬性,可以打印下面的__proto__的值看看都是什么結果。
"字符串".__proto__
(123456).__proto__
(true).__proto__
(function(){}).__proto__
([]).__proto__
({}).__proto__
它們都有值,并且它們的值似乎告訴它們是什么,例如前面都有類型如String或Boolean或在直接放回該類型的字面量寫法function(){}; []; {};,那現在就假設__proto__的用處就是說出它們是誰.。
再關注一點細節,這三個基本類型的__proto__有一些相似,大概是這樣的。
String {length: 0, [[PrimitiveValue]]: ""}
Number {[[PrimitiveValue]]: 0}
Boolean {[[PrimitiveValue]]: false}
//以上出自chrome控制臺
這三個值都是對象,展開它們會發現一些這種類型常用的屬性,例如
length match
toFixed toString
它們都是什么鬼,難道在使用這些屬性或方法的時候都是通過__proto__上找的,我只好假定__proto__的作用是提供一些js原生的屬性和方法,那么剛好就得出一個結論這些值原生的屬性和方法都是從__proto__來的。
接著往下走吧,還是不能理解__proto__,但是大概了解了它的一些信息。
還發現一個規律,__proto__里面還有一個__proto__,并且它們的值都是一樣的并且是一個Object對象,這里又可以得出一個結論,這些數據類型通過__proto__都會找到同一個Object對象。
再接下來插播一下null和undefined
為什么整篇都不見undefined和null這兩個基友,而且當使用undefined.__proto__和null.__proto.__的時候會報錯,說明這兩個并沒有這兩個屬性,但是在js中沒有這個屬性會返回undefined,那只能根據錯誤提示來參考,
Uncaught TypeError: Cannot read property '__proto__' of undefined
未知的類型錯誤,無法讀取undefined的__proto__屬性
也就是說這兩個值不存在屬性或方法的概念,它們本身就代表著無。
那么現在基本可以知道,在js中,只有兩種類型,一種是有值類一種是無值類,有值類都可以通過__proto__最終指向Object對象,而無值類就是null和undefined兩種,一種代表空,一種代表未定義。
到了這里,大概明白了__proto__是干什么的了,我并沒有給它一個明確的定義,但是我可以簡單的說一下它的功能:
除了undefined和null之外的所有值都有__proto__這個值
這個__proto__的值最終會指向同一個Object對象,例如 :類似與這樣查找最終會中找到Object對象:*.__proto.__.__proto.__.***__proto.__
某一個值的每一層的 __proto__中的方法都可以直接使用,例如:true.__proto__中有toString方法,那么就可以直接使用這個true.toString()方法,再例如true.__proto.__.__proto.__中擁有hasOwnProperty這個方法,那么就直接可以使用true.hasOwnProperty()
總結
以上是生活随笔為你收集整理的原型链(__proto__)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: flash导入音乐出错如何解决
- 下一篇: win10电脑黑屏图片壁纸如何设置