些全局變量分為兩種:
一種是 ECMAScript 規(guī)定的,比如:global.parseInt球拦,global.parseFloat靠闭,global.Number
一種是瀏覽器自己加的屬性,比如:window.alert坎炼,window.prompt愧膀,window.comfirm
所有 API 都可以在 MDN 里找到詳細(xì)的資料。這里我主要說的是第一種谣光。
每當(dāng)我們建一個新的對象時檩淋,我們似乎總是能用一大堆原先并沒有定義的方法,這是為啥呢抢肛?因為有原型這個神奇的東西存在狼钮,每當(dāng)我們申明的時候,他就會自動建立一個proto屬性與所對應(yīng)的方法的原型相連捡絮,這樣我們就共用了原型的方法
簡單的來說,我們要搞清楚原型鏈的架構(gòu)莲镣,首先就要明白js的內(nèi)置方法如何被構(gòu)建起來的福稳,由于js的垃圾回收機(jī)制,當(dāng)一個對象未被引用的時候瑞侮,就會被視作垃圾的圆,于是就會被清除鼓拧,但是我們發(fā)現(xiàn)Number,String這些方法都沒有被清除越妈,這就讓人嘖嘖稱奇了季俩。這其實就是在每個對象內(nèi)部加上了一個prototype屬性,叫做該對象的原型屬性梅掠,又給每個對象加上proto,叫做原型鏈指針酌住,他指向本對象的原型對象,用這種方法使得每個對象相互連接阎抒。每當(dāng)我們聲明一個對象時酪我,它就會去找到他所對應(yīng)的方法的原型,然后予以連接且叁,這也就能在建立一個對象以后都哭,他能擁有許多你本身并沒有定義的方法的原因,如圖:
此時逞带,我聲明了變量a欺矫,但是我并沒有給a定義方法,但我toString卻沒有錯展氓,就是因為我的proto屬性已經(jīng)有了這個方法汇陆,所以不報錯。
那么每個對象的原型鏈指針(proto)指向誰呢带饱?內(nèi)置對象的原型對象指向Function的原型,包括內(nèi)置對象Function自己的毡代,如圖:
但是,內(nèi)置對象的原型對象(Function.prototype)的原型對象是誰呢勺疼?因為他本身就是個對象啊教寂,于是他就指向?qū)ο蟮脑蛯ο螅谑?/p>
也就是說执庐,我們以后看見一個兌現(xiàn)酪耕,就判斷他是屬于啥方法,接著就歸到啥方法的原型中去就好了
給出公式:
Object.proto === 對應(yīng)方法的原型.prototype;
再舉一個例子轨淌,還是那個空對象a,a的原型鏈指向應(yīng)該是Object的原型迂烁,因為他就是Object方法構(gòu)造出來的,而a.proto.proto(a的原型的原型鏈指向)就應(yīng)該是null,因為他就是object.prototype.proto递鹉,值為null