成人无码视频,亚洲精品久久久久av无码,午夜精品久久久久久毛片,亚洲 中文字幕 日韩 无码

資訊專欄INFORMATION COLUMN

jQuery源碼分析2-JQ對象添加一些方法和屬性

TANKING / 1026人閱讀

摘要:節(jié)點修改對象的屬性,這就相當(dāng)于把對象轉(zhuǎn)成了一個類數(shù)組,最后返回,可用于鏈?zhǔn)秸{(diào)用。如果傳入的是單標(biāo)簽,且第二個參數(shù)是一個純對象例如則把后面對象的屬性一一添加到創(chuàng)建的這個節(jié)點的屬性上。

我們先看看jQuery的原型中初始化了哪些屬性和方法:

jQuery.fn = jQuery.prototype = {
    jquery: core_version,  //jquery版本號

    constructor: jQuery,   //構(gòu)造器指向

    init:  //jquery的入口函數(shù),主要用來實現(xiàn)選擇器和DOM節(jié)點的創(chuàng)建

    selector: //將選擇器進行存儲

    length:  //當(dāng)前選擇器存儲的DOM節(jié)點的個數(shù)

    toArray:  //通過方法借調(diào)的方式,把一個類數(shù)組對象轉(zhuǎn)換為一個數(shù)組
              //類數(shù)組對象就是指有數(shù)字作為屬性,且有l(wèi)ength屬性,jQuery是一個類數(shù)組對象,arguments也是。
    get: //獲取jQuery對象中的某一個DOM節(jié)點,返回的是一個DOM節(jié)點,

    pushStack: //將一個DOM元素集合加入到j(luò)Query對象的prevObject中。
               //this.prevObject=this,讓當(dāng)前DOM集合存儲到prevObject屬性中,方便end()調(diào)用是回溯。

    each: //對數(shù)組進行遍歷

    ready: //當(dāng)DOM樹加載完畢后,回調(diào)該函數(shù)

    slice:  //類似于toArray方法,只是該方法會進行一次pushStack操作

    first:  //返回第一個元素的jQuery對象

    last:  //返回最后一個元素的jQuery對象

    eq:  //傳入一個數(shù)字num,獲取第num個元素的jQuery對象

    map:   //map將一個數(shù)組中的元素轉(zhuǎn)換到另一個數(shù)組中,可以傳入一個回調(diào)函數(shù),作用與each類似,只是map會返回一個新的數(shù)組,而each不會

    end:   //返回調(diào)用parent()、find()、filter()等方法之前的jQuery對象,就是回溯到上一個DOM合集

    push: core_push,  //存儲了數(shù)組的push方法
    sort: [].sort,   //存儲了數(shù)組的sort方法
    splice: [].splice  //存儲了數(shù)組的splice方法
}

上面是對jQuery初始化的一些方法和屬性的介紹,前面初始化jQuery對象時,我們可以看到j(luò)Query對象其實是一個實例化的jQuery.fn.init,所以這里主要看下init是如何實現(xiàn),其余的方法在具體用到的時候再看。

首先可以觀察到init方法傳入了三個參數(shù):

init: function( selector, context, rootjQuery ) {...}

selector(選擇器)

context(上下文環(huán)境)

rootJQuery( $(document) )

rootjQuery = jQuery(document);//參見866行

init對傳入的選擇器進行了以下的區(qū)分:

空 : 包括 "" false undefined null

if ( !selector ) {return this;}

string:這個部分判斷有點復(fù)雜,會在后面詳細(xì)的介紹。

if ( typeof selector === "string" )...

DOM節(jié)點:修改jQuery對象的屬性 0:selector,length:1 ;這就相當(dāng)于把jQuery對象轉(zhuǎn)成了一個類數(shù)組,最后返回this,可用于鏈?zhǔn)秸{(diào)用。

if ( selector.nodeType ){//通過判斷該變量是否有nodeType屬性來確定是不是一個DOM節(jié)點
this.context = this[0] = selector;
this.length = 1;
return this;}

Function: $(fn) 就相當(dāng)于 $(document).ready(fn)

if ( jQuery.isFunction( selector ){//jquery內(nèi)部用來判斷一個對象是不是一個函數(shù)的方法
return rootjQuery.ready( selector );}

jQuery對象:

if ( selector.selector !== undefined ) {//如果改變了有select屬性則認(rèn)為該變量是jQ變量
this.selector = selector.selector;
this.context = selector.context;
return jQuery.makeArray( selector, this );}

其他任意類型的值:將傳入的變量和jQuery對象合并成一個數(shù)組

return jQuery.makeArray( selector, this );

下面我們來看當(dāng) selector 為一個字符串時是如何進行處理的:

if ( selector.charAt(0) === "<" && selector.charAt( selector.length - 1 ) === ">" && selector.length >= 3 ) {//匹配單標(biāo)簽
    match = [ null, selector, null ];
} else {
    match = rquickExpr.exec( selector );
}
if ( match && (match[1] || !context) ) {   //如果是字符串是html標(biāo)簽
    if ( match[1] ) { 
        jQuery.merge( this,  jQuery.parseHTML(match[1])   );
        //先通過parseHTML將字符串轉(zhuǎn)換成DOM對象的數(shù)組,然后通過merge將DOM對象的數(shù)組合并到this上。
        if ( rsingleTag.test( match[1] ) && jQuery.isPlainObject( context ) ) {
            如果傳入的是單標(biāo)簽,且第二個參數(shù)是一個純對象,例如:
            $("
",{"id":"box", "class":"red"})//則把后面對象的屬性一一添加到創(chuàng)建的這個DOM節(jié)點的屬性上。 //現(xiàn)在知道了通過$不僅可以創(chuàng)建標(biāo)簽,還能在創(chuàng)建單標(biāo)簽的時候直接在后面寫屬性。 } } else { //如果是"#id",直接通過js的原生方法getElementById獲取DOM節(jié)點 elem = document.getElementById( match[2] ); } //后面的情況都是通過find方法來找復(fù)雜的選擇器。例如selector是一個".ClassName" //具體過程為jQuery.fn.find->jQuery.find->Sizzle //最后會調(diào)用Sizzle方法,這是jQuery選擇器的核心方法,是一個獨立的引擎,等到了后面我看懂了再告訴大家吧 (逃 } else if ( !context || context.jquery ) { return ( context || rootjQuery ).find( selector ); } else { return this.constructor( context ).find( selector ); }

看這段代碼前我們要先弄懂match到底是什么東西

rquickExpr = /^(?:s*(<[wW]+>)[^>]*|#([w-]*))$/; (75行)
match = rquickExpr.exec( selector ); (116行)

exec方法用于正則匹配,返回一個數(shù)組,第一個元素是匹配到的字符串,后面的元素為匹配子項,具體用法。

舉個栗子:

var rquickExpr = /^(?:s*(<[wW]+>)[^>]*|#([w-]*))$/;

console.log( match = rquickExpr.exec( "
" ) ); // ["
", "
", undefined] console.log( match = rquickExpr.exec( "#id" ) ); // ["#id", undefined, "id"]

現(xiàn)在我們知道了,match其實就是存儲了字符串含義的數(shù)組,不得不感嘆這是人想出來的嗎。正則懵逼。

如果match[1]存在就代表是html標(biāo)簽

如果match[2]存在就代表是id名

如果兩種情況都沒有匹配到的話,表示這是一個復(fù)雜選擇器,具體的實現(xiàn)是jQuery內(nèi)部的Sizzle方法來實現(xiàn),這個方法有兩千行左右,可謂是jQuery的核心,而且jQuery把這個方法也當(dāng)成了一個多帶帶的庫,如果覺得jQuery太大,只會用到選擇器部分的功能,感興趣的話可以在Sizzle官網(wǎng) 下載

可以看到我們平時調(diào)用 $() 的時候很爽,又能當(dāng)選擇器又能創(chuàng)節(jié)點,但是不知道這后面的實現(xiàn)方法原來這么復(fù)雜,還真是用起來越方便的東西實現(xiàn)越復(fù)雜。

恩,樓上說的對 -。-

感興趣的話可以看看我的github,不妨給個star。

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://m.hztianpu.com/yun/86700.html

相關(guān)文章

  • jQuery 源碼系列(八)data 緩存機制

    摘要:的緩存機制來看看中提高的數(shù)據(jù)緩存機制,有兩個函數(shù),分別是和,可以看出來,一個是在對象上,一個是在生成的對象上。而且從源碼來看,的緩存機制自帶清內(nèi)存操作,更是錦上添花呀。參考源碼分析數(shù)據(jù)緩存本文在上的源碼地址,歡迎來。 歡迎來我的專欄查看系列文章。 不打算介紹 deferred,或者放到后面以后去介紹,因為我對于 js 的異步存在著恐懼,看了半天代碼,發(fā)現(xiàn),用挺好用的,一看源碼,全傻眼了...

    shinezejian 評論0 收藏0
  • jQuery源碼分析3-jQuery對象的擴展--extend

    摘要:的指向的是對象,所以此時擴展的是對象,可以直接通過的方式調(diào)用。 寫過jquery插件的人都知道可以通過jquery提供的extend可以對jquery對象進行擴展,而且該方法不僅可以對jquery對象擴展,還能給一個對象添加新的屬性和方法,這個在后面會介紹。 通過不同的方式調(diào)用extend擴展的方法也不同: 通過 $.extend() 擴展的是靜態(tài)方法; 而通過 $.fn.exten...

    MonoLog 評論0 收藏0
  • 前端基礎(chǔ)進階(十一):詳細(xì)圖解jQuery對象,以及如何擴展jQuery插件

    摘要:而在構(gòu)造函數(shù)中,返回了的實例對象。在中直接返回過的實例,這里的是的真正構(gòu)造函數(shù)最后對外暴露入口時,將字符與對等起來。因此當(dāng)我們直接使用創(chuàng)建一個對象時,實際上是創(chuàng)建了一個的實例,這里的正真構(gòu)造函數(shù)是原型中的方法。 showImg(https://segmentfault.com/img/remote/1460000008749398); 早幾年學(xué)習(xí)前端,大家都非常熱衷于研究jQuery源...

    RebeccaZhong 評論0 收藏0
  • jQuery 源碼系列(一)總體架構(gòu)

    摘要:到目前為止,的貢獻(xiàn)者團隊共名成員,多條,可想而知,是一個多么龐大的項目。參考源碼分析整體架構(gòu)源碼解析讀書筆記第二章構(gòu)造對象函數(shù)詳解本文在上的源碼地址,歡迎來。 歡迎來我的專欄查看系列文章。 決定你走多遠(yuǎn)的是基礎(chǔ),jQuery 源碼分析,向長者膜拜! 我雖然接觸 jQuery 很久了,但也只是局限于表面使用的層次,碰到一些問題,找到 jQuery 的解決辦法,然后使用。顯然,這種做法的...

    svtter 評論0 收藏0
  • zepto源碼分析-代碼結(jié)構(gòu)

    摘要:本來想學(xué)習(xí)一下的源碼,但由于的源碼有多行,設(shè)計相當(dāng)復(fù)雜,所以決定從開始,分析一個成熟的框架的代碼結(jié)構(gòu)及執(zhí)行步驟。同時發(fā)表在我的博客源碼分析代碼結(jié)構(gòu) 本來想學(xué)習(xí)一下jQuery的源碼,但由于jQuery的源碼有10000多行,設(shè)計相當(dāng)復(fù)雜,所以決定從zepto開始,分析一個成熟的框架的代碼結(jié)構(gòu)及執(zhí)行步驟。 網(wǎng)上也有很多zepto的源碼分析,有的給源碼添加注釋,有的談與jQuery的不同,...

    sherlock221 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<