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

首頁 > 編程 > JavaScript > 正文

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

2019-11-20 13:14:45
字體:
供稿:網(wǎng)友

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

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

所以我們來推測,jQuery的實(shí)現(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對象,但是實(shí)際上我們調(diào)用jQuery創(chuàng)建jQuery對象時(shí)并沒有使用new操作符,這是如何實(shí)現(xiàn)的呢?來看jQuery的實(shí)現(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;

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

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

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

發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 肇东市| 共和县| 台南县| 兴仁县| 通州区| 建平县| 武城县| 托克托县| 娄烦县| 平凉市| 和平县| 忻州市| 新乡县| 若尔盖县| 麦盖提县| 大安市| 出国| 祁连县| 隆回县| 台东县| 滦南县| 突泉县| 新蔡县| 牡丹江市| 页游| 忻州市| 彭州市| 合山市| 永宁县| 安阳市| 资源县| 西宁市| 眉山市| 石嘴山市| 巴林右旗| 琼结县| 海林市| 泸西县| 南汇区| 宁明县| 星座|