小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

深入理解javascript原型和閉包(4)

 復雜網(wǎng)絡621 2016-07-23

注意:本文不是javascript基礎教程,如果你沒有接觸過原型的基本知識,應該先去了解一下,推薦看《javascript高級程序設計(第三版)》第6章:面向?qū)ο蟮某绦蛟O計。

上節(jié)已經(jīng)提到,每個函數(shù)function都有一個prototype,即原型。這里再加一句話——每個對象都有一個__proto__,可成為隱式原型。

這個__proto__是一個隱藏的屬性,javascript不希望開發(fā)者用到這個屬性值,有的低版本瀏覽器甚至不支持這個屬性值。所以你在Visual Studio 2012這樣很高級很智能的編輯器中,都不會有__proto__的智能提示,但是你不用管它,直接寫出來就是了。

 

 

上面截圖看來,obj.__proto__和Object.prototype的屬性一樣!這么巧!

答案就是一樣。

obj這個對象本質(zhì)上是被Object函數(shù)創(chuàng)建的,因此obj.__proto__=== Object.prototype。我們可以用一個圖來表示。

 

即,每個對象都有一個__proto__屬性,指向創(chuàng)建該對象的函數(shù)的prototype

 

那么上圖中的“Object prototype”也是一個對象,它的__proto__指向哪里?

好問題!

在說明“Object prototype”之前,先說一下自定義函數(shù)的prototype。自定義函數(shù)的prototype本質(zhì)上就是和 var obj = {} 是一樣的,都是被Object創(chuàng)建,所以它的__proto__指向的就是Object.prototype。

但是Object.prototype確實一個特例——它的__proto__指向的是null,切記切記!

 

還有——函數(shù)也是一種對象,函數(shù)也有__proto__嗎?

又一個好問題!——當然有。

函數(shù)也不是從石頭縫里蹦出來的,函數(shù)也是被創(chuàng)建出來的。誰創(chuàng)建了函數(shù)呢?——Function——注意這個大寫的“F”。

且看如下代碼。

以上代碼中,第一種方式是比較傳統(tǒng)的函數(shù)創(chuàng)建方式,第二種是用new Functoin創(chuàng)建。

首先根本不推薦用第二種方式。

這里只是向大家演示,函數(shù)是被Function創(chuàng)建的。

 

好了,根據(jù)上面說的一句話——對象的__proto__指向的是創(chuàng)建它的函數(shù)的prototype,就會出現(xiàn):Object.__proto__ === Function.prototype。用一個圖來表示。

上圖中,很明顯的標出了:自定義函數(shù)Foo.__proto__指向Function.prototype,Object.__proto__指向Function.prototype,唉,怎么還有一個……Function.__proto__指向Function.prototype?這不成了循環(huán)引用了?

對!是一個環(huán)形結構。

其實稍微想一下就明白了。Function也是一個函數(shù),函數(shù)是一種對象,也有__proto__屬性。既然是函數(shù),那么它一定是被Function創(chuàng)建。所以——Function是被自身創(chuàng)建的。所以它的__proto__指向了自身的Prototype。

 

篇幅不少了,估計也都看煩了。快結束了。

最后一個問題:Function.prototype指向的對象,它的__proto__是不是也指向Object.prototype?

答案是肯定的。因為Function.prototype指向的對象也是一個普通的被Object創(chuàng)建的對象,所以也遵循基本的規(guī)則。

 

OK 本節(jié)結束,是不是很亂?

亂很正常。那這一節(jié)就讓它先亂著,下一節(jié)我們將請另一個老朋友來幫忙,把它理清楚。這位老朋友就是——instanceof。

具體內(nèi)容,請看下節(jié)分解。

---------------------------------------------------------------------------

本文已更新到《深入理解javascript原型和閉包系列》的目錄,更多內(nèi)容可參見《深入理解javascript原型和閉包系列》。

另外,歡迎關注我的微博。

也歡迎關注我的其他教程:

用grunt搭建自動化的web前端開發(fā)環(huán)境從設計到模式》《json2.js源碼解讀視頻》《微軟petshop4.0源碼解讀視頻

--------------------------------------------------------------------------

    本站是提供個人知識管理的網(wǎng)絡存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權內(nèi)容,請點擊一鍵舉報。
    轉藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多