圖解JavaScript對象原型與原型鏈


使用顏色、形狀可視化Javascript中抽象的原型鏈概念:javascript

  1. 橙黃色實心表明函數,函數是可執行的對象;
  2. 橘紅色圈圈表明prototype屬性,且老是存在於函數對象中;
  3. 藍紫色帶箭頭線段表明原型鏈的走向;
  4. 藍綠色實心表明普通對象

圈圈+實心組合形式的含義:java

  1. 橘紅色圈圈+黃色實心表明prototype屬性爲函數對象;
  2. 橘黃色圈圈+藍綠色實心表明prototype屬性爲普通對象;

圖中,prototype屬性就是能夠被繼承的原型,原型能夠是函數,也能夠是普通對象,沒有原型的對象爲數很少,Object.prototype就是其中之一,如圖中右側所示Object.prototype原型鏈箭頭指向null,這裏是全部原型鏈的終點,也意味着原型鏈到此結束,知足:函數

Object.prototype.__proto__ === null // true
複製代碼

咱們熟悉的JSONMath都是普通對象,而不是構造函數,所以它們兩個的原型都是Object.prototype,知足:ui

JSON.__proto__ === Object.prototype // true
Math.__proto__ === Object.prototype // true
複製代碼

咱們使用對象直接量{}建立的對象,和使用不經常使用的new Object()寫法所建立的對象的原型也都是Object.prototypespa

使用Object.create()建立的對象的原型卻不必定是Object.prototype,這取決於傳入的第一個參數,由於第一個參數是用來指定咱們想要建立的對象的原型,除非第一個參數傳入Object.prototype``,顯然這麼作對Object.create()```這個方法屬實大材小用了。prototype

許多常見的內置構造函數,好比DateRegExp等等,它們是函數,由於能夠和new關鍵字一塊兒使用而建立新的對象,因此被稱做構造函數,不過它們也是對象,特殊的能夠執行對象。code

幾乎全部函數,不管是JS內置構造函數,仍是咱們建立的函數,它們的原型都是Function.prototype,知足:cdn

Date.__proto__ === Function.prototype // true
Array.__proto__ === Function.prototype // true

function myFunc(){}
myFunc.__proto__ === Function.prototype // true
複製代碼

內置構造函數Function的原型和其它函數同樣,也是Function.prototype,這就像是本身的原型就是本身身上的一個部分,妙。知足:對象

Function.__proto__ === Function.prototype // true
複製代碼

幾乎全部內置的構造函數的prototype屬性都是普通對象,但構造函數Function除外,由於Function.prototype的特殊之處在於,它是可執行的函數對象,不是普通對象:blog

typeof Function.prototype // "function"
複製代碼

讓我以爲JS在強行自圓其說的一點是,雖然Function.prototype也是函數,可是它的原型竟是Object.prototype

Function.prototype.__proto__ === Object.prototype // true
複製代碼

爲何Function.prototype做爲一個函數,它的原型不該該是Function.prototype自身嗎,規範就是這麼規定的,因此說Function屬於比較個性的一位,它的特殊總結來講分爲如下兩點:

  1. Function的原型就是Function.prototype。可是好比說Date.__proto__ === Date.prototype就不成立;
  2. DateArrayFunction等等都是函數,且它們的原型也是函數Function.prototype,可是Function.prototype的原型倒是Object.prototype,而不是它自身。

Function.prototype同樣特殊的就是Object.prototype了,由於Object.prototype雖然是對象,可是它的原型不是它自身,而是null。

並非全部函數的原型都是Function.prototype,由於Function.prototype自身也是函數;
並非全部對象的原型都是Object.prototype,由於Object.prototype自身也是對象;

我只能告訴你,Function.prototype是一個特殊的函數;
我只能告訴你,Object.prototype是一個特殊的對象。

這世界,許多事不能僅靠理性就能講明白,就像男人永遠別期望和女人理性的講道理,懂得太多的人被心眼絆倒。我所知道的太少太少,咱們知道的都太少了,事情背後有太多不知道的事情了,事情的事情的背後又有不知道的事情。

絕要中止探尋真理的步伐,哪怕一切徒勞,人總要有事可作。

null是一切吖。



原文連接:shuaihua.cc/article/jav…

原創做者:帥華君

相關文章
相關標籤/搜索