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

jQuery內部原理和實現(xiàn)方式淺析

 更新時間:2015年02月03日 09:40:53   作者:Hito''s Blog  
這篇文章主要介紹了jQuery內部原理和實現(xiàn)方式淺析,本文試圖從整體來闡述一下jQuery的內部實現(xiàn),需要的朋友可以參考下

這段時間在學習研究jQuery源碼,受益于jQuery日益發(fā)展強大,研究jQuery的大牛越來越多,學習的資料也比前兩年好找了,有很多非常不錯的資源,如高云的jQuery1.6.1源碼分析系列。這些教程非常細致的分析了jQuery內部原理和實現(xiàn)方式,對學習和理解jQuery有非常大的幫助。但是個人認為很多教程對jQuery的整體結果把握不足,本人試圖從整體來闡述一下jQuery的內部實現(xiàn)。

大家知道,調用jQuery有兩種方式,一種是高級的實現(xiàn),通過傳遞一個參數(shù)實現(xiàn)DOM選擇,如通過$(“h1″)選擇所有的h1元素,第二種是較為低級的實現(xiàn),如果通過$.ajax實現(xiàn)ajax的操作。那么,這兩種方式到底有何不同?用typeof函數(shù)檢測$(‘h1′)和$.ajax,類型分別為object和function,稍微學過jQuery的都知道或者聽過過,前者返回的是一個jQuery對象,那么jQuery對象是什么,它和jQuery是什么關系呢?我們先來通過for(var i in $(”)) document.write(i+” :::”+$(“”)[i]+””);打印一下jQuery對象的屬性和對應的值,可以看到它有100多個屬性,通過console輸入$(“*”)可以看到大部分屬性是繼承自jQuery原型的屬性,jQuery對象實際上是這樣一個對象:

所以我們來推測,jQuery的實現(xiàn)可能是類似這樣的:

function jQuery(){
 this[0]="Some DOM Element";
 this[1]="Some DOM Element";
 this[2]="Some DOM Element";
 this.length=3;
 this.prevObject="Some Object";
 this.context="Some Object";
 this.selector="Some selector";
}
jQuery.prototype={
get:function(){},
each:function(){},
......
}

這些代碼通過new操作符就就能創(chuàng)建出擁有上述屬性的jQuery對象,但是實際上我們調用jQuery創(chuàng)建jQuery對象時并沒有使用new操作符,這是如何實現(xiàn)的呢?來看jQuery的實現(xiàn):

var jQuery = function( selector, context ) {
 // The jQuery object is actually just the init constructor 'enhanced'
 return new jQuery.fn.init( selector, context, rootjQuery );
}
jQuery.fn=jQuery.prototype={
 jquery: core_version,
 init:function(selector,context){
 //some code
 return this;
 }
 //some code there
 //......
}
jQuery.fn.init.prototype=jQuery.fn;

這里有幾點做得非常巧妙的地方,第一點是通過jQuery原型屬性的init方法來創(chuàng)建對象來達到不用new創(chuàng)建對象的目的,第二點是對init方法內this指向的處理。我們知道,通過調用init返回一個jQuery的實例,那么這個實例就必須要繼承jQuery.prototype的屬性,那么init里面這個this, 就繼承jQuery.prototype的屬性。但是init里面的this,受制于作用域的限制,并不能訪問jQuery.prototype其它的屬性,jQuery通過一句'jQuery.fn.init.prototype=jQuery.fn'把它的原型指向jQuery.fn,這樣以來,init產(chǎn)生的jQuery對象就擁有了jQuery.fn的屬性。

到這里,一個jQuery的基本原型就浮出水面了。這里有兩個對象,一個是jQuery這個構造函數(shù),另外一個是這個構造函數(shù)產(chǎn)生的對象(我們稱之為jQuery對象,它和普通對象沒有什么區(qū)別), 如下關系圖:

可以看到jQuery構造函數(shù)和jQuery.prototype均有各自的屬性和方法,兩者的調用方法各不一樣,這兩個對象都有一個extend方法,都是用來擴展自身的屬性和方法,在jQuery內部,extend的實現(xiàn)實際是靠一樣的代碼, 將在后面的源碼分析中做以詳細的分析。

相關文章

最新評論

北宁市| 来宾市| 苍梧县| 泰来县| 女性| 钟山县| 平度市| 玉山县| 鹤壁市| 扎鲁特旗| 宕昌县| 贵阳市| 安达市| 陇川县| 许昌县| 同心县| 台中市| 金川县| 西乌珠穆沁旗| 博爱县| 赤水市| 河间市| 渑池县| 麻栗坡县| 太湖县| 三都| 来宾市| 米林县| 新干县| 安宁市| 辽源市| 民县| 陕西省| 固原市| 都兰县| 如皋市| 黑山县| 平遥县| 香港 | 南通市| 宁海县|