国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 網站 > WEB開發 > 正文

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

2024-04-27 15:16:15
字體:
來源:轉載
供稿:網友
原文地址:http://www.cnblogs.com/wangfupeng1988/p/3979290.html

上節已經提到,每個函數function都有一個PRototype,即原型。這里再加一句話——每個對象都有一個__proto__,可成為隱式原型。

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

 

 

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

答案就是一樣。

obj這個對象本質上是被Object函數創建的,因此obj.__proto__=== Object.prototype。我們可以用一個圖來表示。

 

即,每個對象都有一個__proto__屬性,指向創建該對象的函數的prototype。

 

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

好問題!

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

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

 

還有——函數也是一種對象,函數也有__proto__嗎?

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

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

且看如下代碼。

以上代碼中,第一種方式是比較傳統的函數創建方式,第二種是用new Functoin創建。

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

這里只是向大家演示,函數是被Function創建的。

 

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

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

對!是一個環形結構。

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

 

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

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

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

 

OK 本節結束,是不是很亂?

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

具體內容,請看下節分解。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 全州县| SHOW| 突泉县| 肇庆市| 平江县| 云浮市| 安吉县| 通江县| 临澧县| 宁城县| 阜新市| 呼伦贝尔市| 孟州市| 淮滨县| 海阳市| 辽阳县| 措美县| 大竹县| 堆龙德庆县| 白河县| 修武县| 新龙县| 临朐县| 宁安市| 海丰县| 称多县| 昌黎县| 本溪市| 朝阳区| 军事| 长海县| 博湖县| 收藏| 咸宁市| 鸡泽县| 余江县| 河池市| 新源县| 白水县| 静宁县| 苗栗市|