最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

理解Javascript_08_函數(shù)對象

 更新時(shí)間:2010年10月15日 23:55:31   作者:  
如果你無法理解博文在講什么,請回顧前面的系列博文。文章比較深入,如有不對之處,望請指正,謝謝。
函數(shù)對象
首先,大家得明確一個(gè)概念:函數(shù)就是對象,代表函數(shù)的對象就是函數(shù)對象。既然是對象,那它又是被誰構(gòu)造出來的呢?下面我們來看一段描述:JavaScript代碼中定義函數(shù),或者調(diào)用Function創(chuàng)建函數(shù)時(shí),最終都會以類似這樣的形式調(diào)用Function函數(shù):var newFun=Function(funArgs, funBody); 。由此可知函數(shù)對象是由Function這個(gè)函數(shù)對象構(gòu)造出來的。
注:Function對象本身也是一個(gè)函數(shù),因此它也一個(gè)函數(shù)對象。關(guān)于Function的深入理解,請見后續(xù)博文。
正面我們來看一段代碼:
復(fù)制代碼 代碼如下:

//定義方式一
function func(x) {
alert(x);
}
//定義方式二
var func = function(x) {
alert(x);
};
//實(shí)際執(zhí)行
var func = new Function(“x”, “alert(x);”);

通過上面的代碼可知,函數(shù)func無非是由Function對象接收兩個(gè)參數(shù)后構(gòu)造出來的而矣!

注:關(guān)于定義方式一與定義方式二的區(qū)別,請見后續(xù)博文



函數(shù)對象的創(chuàng)建過程

函數(shù)對象詳細(xì)創(chuàng)建步驟如下:

1. 創(chuàng)建一個(gè)build-in object對象fn

2. 將fn的內(nèi)部[[Prototype]]設(shè)為Function.prototype
3. 設(shè)置內(nèi)部的[[Call]]屬性,它是內(nèi)部實(shí)現(xiàn)的一個(gè)方法,處理函數(shù)調(diào)用的邏輯。(簡單的理解為調(diào)用函數(shù)體)

4. 設(shè)置內(nèi)部的[[Construct]]屬性,它是內(nèi)部實(shí)現(xiàn)的一個(gè)方法,處理邏輯參考對象創(chuàng)建過程。(簡單的理解為創(chuàng)建對象《理解Javascript_06_理解對象的創(chuàng)建過程》一文)

5. 設(shè)置fn.length為funArgs.length,如果函數(shù)沒有參數(shù),則將fn.length設(shè)置為0
6. 使用new Object()同樣的邏輯創(chuàng)建一個(gè)Object對象fnProto
7. 將fnProto.constructor設(shè)為fn
8. 將fn.prototype設(shè)為fnProto
9. 返回fn

步驟1跟步驟6的區(qū)別為,步驟1只是創(chuàng)建內(nèi)部用來實(shí)現(xiàn)Object對象的數(shù)據(jù)結(jié)構(gòu)(build-in object structure),并完成內(nèi)部必要的初始化工作,但它的[[Prototype]]、[[Call]]、[[Construct]]等屬性應(yīng)當(dāng)為 null或者內(nèi)部初始化值,即我們可以理解為不指向任何對象(對[[Prototype]]這樣的屬性而言),或者不包含任何處理(對 [[Call]]、[[Construct]]這樣的方法而言)。步驟6則將按照《理解Javascript_06_理解對象的創(chuàng)建過程》創(chuàng)建一個(gè)新的對象,它的 [[Prototype]]等被設(shè)置了。
從上面的處理步驟可以了解,任何時(shí)候我們定義一個(gè)函數(shù),它的prototype是一個(gè)Object實(shí)例,這樣默認(rèn)情況下我們創(chuàng)建自定義函數(shù)的實(shí)例對象時(shí),它們的Prototype鏈將指向Object.prototype。

注:Function一個(gè)特殊的地方,是它的[[Call]]和[[Construct]]處理邏輯一樣。深層次的原因?qū)⒃诤罄m(xù)博文中介紹。

下面我們寫一些用例腳本來測試一下上面的理論:

復(fù)制代碼 代碼如下:

function Animal(){
}
alert(Animal.length);//0

var dog = new Animal();

這個(gè)JS證明了步驟5的正確性。最后,還是來看一下函數(shù)對象的內(nèi)存圖,簡單起見,內(nèi)存圖只描述了Animal的構(gòu)造過程:

來自于一個(gè)整體的分析圖:

圖片本身已經(jīng)能解釋很多很多的問題了,結(jié)合前面instanceof原理,對象構(gòu)造原理,原型鏈原理,自已去體會吧,我就不多說什么了。

其實(shí)上Function對象是一個(gè)很奇妙的對象,它與Object的關(guān)系更是撲朔迷離,我將在《理解Javascript_09_Function與Object》中解釋這一切。


最后的聲明:理論過于復(fù)雜,我不改保證其正確性。但經(jīng)過多方的測試,還未發(fā)現(xiàn)理論與實(shí)際沖突的地方。

相關(guān)文章

最新評論

新化县| 菏泽市| 海林市| 郴州市| 吉木萨尔县| 岳阳县| 开江县| 忻州市| 定西市| 平顶山市| 金山区| 西充县| 平定县| 县级市| 凯里市| 乐东| 荣成市| 兴和县| 林州市| 阿巴嘎旗| 岳西县| 工布江达县| 河东区| 专栏| 五家渠市| 龙游县| 沽源县| 岳普湖县| 元氏县| 阿勒泰市| 稻城县| 兰考县| 临邑县| 栾城县| 佛冈县| 威海市| 手机| 纳雍县| 汤原县| 汶上县| 扎鲁特旗|