理解Javascript_09_Function與Object
更新時(shí)間:2010年10月16日 00:02:31 作者:
在《理解Javascript_08_函數(shù)對(duì)象》中講解了很多函數(shù)對(duì)象的問(wèn)題,同時(shí)也留下了許多疑問(wèn),今天讓我們來(lái)解答部分問(wèn)題。
注:理論過(guò)于深入,本人不改保證所有的理論都是正確的,但經(jīng)過(guò)多方測(cè)試還未發(fā)現(xiàn)實(shí)際代碼與理論沖突的問(wèn)題。如有錯(cuò)誤,望高人指點(diǎn)!
Function
首先回顧一下函數(shù)對(duì)象的概念,函數(shù)就是對(duì)象,代表函數(shù)的對(duì)象就是函數(shù)對(duì)象。所有的函數(shù)對(duì)象是被Function這個(gè)函數(shù)對(duì)象構(gòu)造出來(lái)的。也就是說(shuō),F(xiàn)unction是最頂層的構(gòu)造器。它構(gòu)造了系統(tǒng)中所有的對(duì)象,包括用戶自定義對(duì)象,系統(tǒng)內(nèi)置對(duì)象,甚至包括它自已。這也表明Function具有自舉性(自已構(gòu)造自己的能力)。這也間接決定了Function的[[call]]和[[constructor]]邏輯相同。
function Foo() {};
var foo = new Foo();
//Foo為foo的構(gòu)造函數(shù)
alert(foo instanceof Foo); // true
//但是Function并不是foo的構(gòu)造函數(shù)
alert(foo instanceof Function); // false
//Function為Foo的構(gòu)造函數(shù)
alert(Foo instanceof Function);//true
上面的代碼解釋了foo和其構(gòu)造函數(shù)Foo和Foo的構(gòu)造函數(shù)Function的關(guān)系。(具體原理請(qǐng)參見(jiàn)Function與Object的內(nèi)存關(guān)系圖)
Object
對(duì)于Object它是最頂層的對(duì)象,所有的對(duì)象都將繼承Object的原型,但是你也要明確的知道Object也是一個(gè)函數(shù)對(duì)象,所以說(shuō)Object是被Function構(gòu)造出來(lái)的。(關(guān)于Object并沒(méi)有太多的理論)
Function與Object
這是本文的重點(diǎn),非常重要!
alert(Function instanceof Function);//true
alert(Function instanceof Object);//true
alert(Object instanceof Function);//true
function Foo() {};
var foo = new Foo();
alert(foo instanceof Foo); // true
alert(foo instanceof Function); // false
alert(foo instanceof Object); // true
alert(Foo instanceof Function); // true
alert(Foo instanceof Object); // true
你能理解這些答案嗎?那恭喜你,Javascript語(yǔ)言的本質(zhì)你已經(jīng)理解了。
那么讓我們來(lái)看一下Object與Function實(shí)際的關(guān)系吧:

在你看圖之前,請(qǐng)先閱讀函數(shù)對(duì)象與instanceof原理兩篇文章,要不然內(nèi)存圖很難理解。
在這,我對(duì)內(nèi)存圖做一點(diǎn)說(shuō)明:在函數(shù)對(duì)象一文中提到了函數(shù)對(duì)象的構(gòu)造過(guò)程,在本文中提到Function為自舉性的,所以說(shuō)函數(shù)對(duì)象Foo的構(gòu)造過(guò)程和函數(shù)對(duì)象Function的構(gòu)造過(guò)程是一樣的。所以在圖中給于高亮顯示,我用'|'來(lái)分隔來(lái)表示它們的構(gòu)造過(guò)程相同。根據(jù)instanceof的理論,和內(nèi)存圖,可以將上面的語(yǔ)句都推導(dǎo)出正確的結(jié)果。在此我們不一一講述了,讀者自已體會(huì)吧。
如果你不能理解這張復(fù)雜的內(nèi)存圖的話,可以看下面的說(shuō)明圖來(lái)幫助理解:

注:代碼的實(shí)際執(zhí)行流程并不完全像這張圖上描述的那樣,也就是說(shuō)這張圖是有問(wèn)題的(可以說(shuō)是錯(cuò)誤的),它無(wú)法解釋為什么Function instanceof Function 為true。 但是它易于理解Function與Object的關(guān)系。
Function
首先回顧一下函數(shù)對(duì)象的概念,函數(shù)就是對(duì)象,代表函數(shù)的對(duì)象就是函數(shù)對(duì)象。所有的函數(shù)對(duì)象是被Function這個(gè)函數(shù)對(duì)象構(gòu)造出來(lái)的。也就是說(shuō),F(xiàn)unction是最頂層的構(gòu)造器。它構(gòu)造了系統(tǒng)中所有的對(duì)象,包括用戶自定義對(duì)象,系統(tǒng)內(nèi)置對(duì)象,甚至包括它自已。這也表明Function具有自舉性(自已構(gòu)造自己的能力)。這也間接決定了Function的[[call]]和[[constructor]]邏輯相同。
復(fù)制代碼 代碼如下:
function Foo() {};
var foo = new Foo();
//Foo為foo的構(gòu)造函數(shù)
alert(foo instanceof Foo); // true
//但是Function并不是foo的構(gòu)造函數(shù)
alert(foo instanceof Function); // false
//Function為Foo的構(gòu)造函數(shù)
alert(Foo instanceof Function);//true
上面的代碼解釋了foo和其構(gòu)造函數(shù)Foo和Foo的構(gòu)造函數(shù)Function的關(guān)系。(具體原理請(qǐng)參見(jiàn)Function與Object的內(nèi)存關(guān)系圖)
Object
對(duì)于Object它是最頂層的對(duì)象,所有的對(duì)象都將繼承Object的原型,但是你也要明確的知道Object也是一個(gè)函數(shù)對(duì)象,所以說(shuō)Object是被Function構(gòu)造出來(lái)的。(關(guān)于Object并沒(méi)有太多的理論)
Function與Object
這是本文的重點(diǎn),非常重要!
復(fù)制代碼 代碼如下:
alert(Function instanceof Function);//true
alert(Function instanceof Object);//true
alert(Object instanceof Function);//true
function Foo() {};
var foo = new Foo();
alert(foo instanceof Foo); // true
alert(foo instanceof Function); // false
alert(foo instanceof Object); // true
alert(Foo instanceof Function); // true
alert(Foo instanceof Object); // true
你能理解這些答案嗎?那恭喜你,Javascript語(yǔ)言的本質(zhì)你已經(jīng)理解了。
那么讓我們來(lái)看一下Object與Function實(shí)際的關(guān)系吧:

在你看圖之前,請(qǐng)先閱讀函數(shù)對(duì)象與instanceof原理兩篇文章,要不然內(nèi)存圖很難理解。
在這,我對(duì)內(nèi)存圖做一點(diǎn)說(shuō)明:在函數(shù)對(duì)象一文中提到了函數(shù)對(duì)象的構(gòu)造過(guò)程,在本文中提到Function為自舉性的,所以說(shuō)函數(shù)對(duì)象Foo的構(gòu)造過(guò)程和函數(shù)對(duì)象Function的構(gòu)造過(guò)程是一樣的。所以在圖中給于高亮顯示,我用'|'來(lái)分隔來(lái)表示它們的構(gòu)造過(guò)程相同。根據(jù)instanceof的理論,和內(nèi)存圖,可以將上面的語(yǔ)句都推導(dǎo)出正確的結(jié)果。在此我們不一一講述了,讀者自已體會(huì)吧。
如果你不能理解這張復(fù)雜的內(nèi)存圖的話,可以看下面的說(shuō)明圖來(lái)幫助理解:

注:代碼的實(shí)際執(zhí)行流程并不完全像這張圖上描述的那樣,也就是說(shuō)這張圖是有問(wèn)題的(可以說(shuō)是錯(cuò)誤的),它無(wú)法解釋為什么Function instanceof Function 為true。 但是它易于理解Function與Object的關(guān)系。
您可能感興趣的文章:
- javascript中的 object 和 function小結(jié)
- JavaScript中Function函數(shù)與Object對(duì)象的關(guān)系
- 淺談Javascript中Object與Function對(duì)象
- 淺談Javascript中的Function與Object
- 驗(yàn)證javascript中Object和Function的關(guān)系的三段簡(jiǎn)單代碼
- javascript Object與Function使用
- JavaScript中Object和Function的關(guān)系小結(jié)
- JavaScript中Function與Object的關(guān)系
相關(guān)文章
JS延時(shí)器提示框的應(yīng)用實(shí)例代碼解析
這篇文章主要介紹了JS延時(shí)器提示框的應(yīng)用實(shí)例代碼解析 的相關(guān)資料,需要的朋友可以參考下2016-04-04Selenium執(zhí)行Javascript腳本參數(shù)及返回值過(guò)程詳解
這篇文章主要介紹了Selenium執(zhí)行Javascript腳本參數(shù)及返回值過(guò)程詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-04-04uniapp微信小程序打卡功能的詳細(xì)實(shí)現(xiàn)流程
最近因?yàn)楣ぷ餍枰?搭建了一個(gè)加班打卡的小程序,下面這篇文章主要給大家介紹了關(guān)于uniapp微信小程序打卡功能的詳細(xì)實(shí)現(xiàn)流程,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-12-12JavaScript給事件委托批量添加事件監(jiān)聽(tīng)詳細(xì)流程
事件委托,一般來(lái)講,會(huì)把一個(gè)或者一組元素的事件委托到它的父層或者更外層元素上,真正綁定事件的是外層元素,當(dāng)事件響應(yīng)到需要綁定的元素上時(shí),會(huì)通過(guò)事件冒泡機(jī)制從而觸發(fā)它的外層元素的綁定事件上,然后在外層元素上去執(zhí)行函數(shù)2021-10-10JavaScript獲取網(wǎng)頁(yè)中第一個(gè)圖片id的方法
這篇文章主要介紹了JavaScript獲取網(wǎng)頁(yè)中第一個(gè)圖片id的方法,涉及javascript中document.images方法的使用技巧,需要的朋友可以參考下2015-04-04js 判斷瀏覽器類型 去全角、半角空格 自動(dòng)關(guān)閉當(dāng)前窗口
去全角、半角空格 自動(dòng)關(guān)閉當(dāng)前窗口等實(shí)現(xiàn)函數(shù)。2009-04-04JavaScript?新提案optional?chaining可選鏈屬性原理詳解
這篇文章主要為大家介紹了JavaScript?新提案optional?chaining可選鏈屬性原理詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-05-05