亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

jQuery源碼學(xué)習(xí)之extend

quietin / 3197人閱讀

摘要:源碼學(xué)習(xí)之用于合并對(duì)象,可選擇是否深復(fù)制。盡管官方文檔明確指出第一個(gè)參數(shù)是的調(diào)用情況并不支持,但是這個(gè)版本的源碼中,判斷第一個(gè)參數(shù)的類型雖有限定是類型,但卻未對(duì)其值真假加以限定。調(diào)用方式源碼和指向同一個(gè)函數(shù),在函數(shù)內(nèi)部,對(duì)調(diào)用情況進(jìn)行區(qū)分。

jQuery源碼學(xué)習(xí)之extend

$.extend用于合并對(duì)象,可選擇是否深復(fù)制。使用時(shí),第一個(gè)參數(shù)為合并后的對(duì)象。如果要進(jìn)行深拷貝,則參數(shù)1為true,參數(shù)2為要合并的目標(biāo)對(duì)象。盡管jQuery官方文檔明確指出第一個(gè)參數(shù)是false的調(diào)用情況并不支持,但是這個(gè)版本的源碼中,判斷第一個(gè)參數(shù)的類型雖有限定是boolean類型,但卻未對(duì)其值真假加以限定。所以第一個(gè)參數(shù)是false也是可行的。

$.fn.extend({})用于拓展jq原型對(duì)象,使用只能傳入一個(gè)對(duì)象,多用于jq插件定義。

調(diào)用方式
jQuery.extend( target [, object1 ] [, objectN ] )
Query.extend( [deep ], target, object1 [, objectN ] )
jQuery.fn.extend( object )
源碼

jQuery.extendjQuery.fn.extend指向同一個(gè)函數(shù),在函數(shù)內(nèi)部,對(duì)調(diào)用情況進(jìn)行區(qū)分。首先判斷第一個(gè)參數(shù)的類型,確定是否顯式指定深復(fù)制。使用target保存合并對(duì)象的引用,如果target不是對(duì)象的,要指向空對(duì)象。

接著判斷參數(shù)的個(gè)數(shù),區(qū)別jQuery.extendjQuery.fn.extend的調(diào)用。然后使用for循環(huán),從第二個(gè)參數(shù)開始遍歷,進(jìn)行拷貝;拷貝時(shí)使用src保存target上的屬性,copy保存被合并對(duì)象上的屬性。使用for...in循環(huán)遍歷屬性名進(jìn)行拷貝,拷貝時(shí)忽略對(duì)target自身引用,copy為空時(shí)也會(huì)被忽略,如果根據(jù)是否需要深拷貝來決定是否對(duì)objectarray遞歸深拷貝。如果是淺拷貝,直接保存值或引用。

值得一提的是,遍歷被合并對(duì)象時(shí)使用的是for...in循環(huán),所以傳入stringarray類型的參數(shù)也會(huì)被遍歷,在合并后對(duì)象中的屬性名為索引。由于遍歷參數(shù)是從target后的第一個(gè)參數(shù)開始,所以先傳入的對(duì)象會(huì)被后傳入對(duì)象的同名屬性覆蓋。

jQuery.extend = jQuery.fn.extend = function() {
    // target是對(duì)象或true,從第二個(gè)參數(shù)開始遍歷
    var options, name, src, copy, copyIsArray, clone,
        target = arguments[ 0 ] || {},
        i = 1,
        length = arguments.length,
        deep = false;

    // Handle a deep copy situation
    // 第一個(gè)參數(shù)如果是boolean,表明顯示指定是否深復(fù)制
    if ( typeof target === "boolean" ) {
        deep = target;

        // Skip the boolean and the target
        // 將target指向第一個(gè)參數(shù),從第三個(gè)參數(shù)開始合并
        target = arguments[ i ] || {};
        i++;
    }

    // Handle case when target is a string or something (possible in deep copy)
    // 不是對(duì)象或函數(shù),將target設(shè)置默認(rèn)空
    if ( typeof target !== "object" && !jQuery.isFunction( target ) ) {
        target = {};
    }

    // Extend jQuery itself if only one argument is passed
    // 只有一個(gè)參數(shù),即$.fn.extend({}),target指向jq原型
    if ( i === length ) {
        target = this;
        i--;
    }

    // 先傳入的對(duì)象會(huì)被后傳入對(duì)象的同名屬性覆蓋
    for ( ; i < length; i++ ) {

        // Only deal with non-null/undefined values
        // 保存當(dāng)前的非空對(duì)象。
        if ( ( options = arguments[ i ] ) != null ) {

            // Extend the base object
            // 遍歷,for...in會(huì)遍歷數(shù)組或字符串
            // src為target屬性值,copy為闖入對(duì)象的屬性值
            for ( name in options ) {
                src = target[ name ];
                copy = options[ name ];

                // Prevent never-ending loop
                // 自身的屬性指向自身,這種情況避免無限循環(huán),跳過自身引用的復(fù)制
                if ( target === copy ) {
                    continue;
                }

                // Recurse if we"re merging plain objects or arrays
                // 深復(fù)制時(shí),調(diào)用$.extend遞歸調(diào)用。
                // 復(fù)制時(shí)保存屬性的原始類型,只有對(duì)象或數(shù)組才必要進(jìn)行深復(fù)制
                if ( deep && copy && ( jQuery.isPlainObject( copy ) ||
                    ( copyIsArray = Array.isArray( copy ) ) ) ) {

                    if ( copyIsArray ) {
                        copyIsArray = false;
                        clone = src && Array.isArray( src ) ? src : [];

                    } else {
                        clone = src && jQuery.isPlainObject( src ) ? src : {};
                    }

                    // Never move original objects, clone them
                    target[ name ] = jQuery.extend( deep, clone, copy );

                // Don"t bring in undefined values
                // 淺復(fù)制,值非空直接復(fù)制或保存引用
                } else if ( copy !== undefined ) {
                    target[ name ] = copy;
                }
            }
        }
    }

    // Return the modified object
    return target;
};

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

轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/96358.html

相關(guān)文章

  • jQuery源碼學(xué)習(xí)之event

    摘要:回調(diào)隊(duì)列中的元素是對(duì)象,代表一個(gè)事件回調(diào),擁有多個(gè)屬性,如等等,其中是回調(diào)函數(shù),在觸發(fā)時(shí)通過傳遞,具體的在后面講。類型是時(shí)鍵表示事件名,規(guī)則同上,鍵值表示事件觸發(fā)時(shí)的回調(diào)函數(shù)。 jQuery源碼學(xué)習(xí)之event jQuery的事件機(jī)制為異步回調(diào),事件監(jiān)聽的屬性、參數(shù)和回調(diào)的等保存在Data實(shí)例中,在元素上保存該對(duì)象的引用。有方法handle,內(nèi)部執(zhí)行dispatch;有屬性events...

    XboxYan 評(píng)論0 收藏0
  • jQuery源碼學(xué)習(xí)之Callbacks

    摘要:源碼學(xué)習(xí)之的通過回調(diào)實(shí)現(xiàn)異步,其實(shí)現(xiàn)核心是。回調(diào)函數(shù)隊(duì)列中的函數(shù)返回時(shí)停止觸發(fā)回調(diào)函數(shù)隊(duì)列只能被觸發(fā)一次記錄上一次觸發(fā)隊(duì)列傳入的值,新添加到隊(duì)列中的函數(shù)使用記錄值作為參數(shù),并立即執(zhí)行。實(shí)際是,內(nèi)部則調(diào)用了在定義的局部函數(shù)。 jQuery源碼學(xué)習(xí)之Callbacks jQuery的ajax、deferred通過回調(diào)實(shí)現(xiàn)異步,其實(shí)現(xiàn)核心是Callbacks。 使用方法 使用首先要先新建一個(gè)...

    lmxdawn 評(píng)論0 收藏0
  • Javascript設(shè)計(jì)模式學(xué)習(xí)之Decorator(裝飾者)模式

    摘要:抽象模式使用的裝飾者模式允許我們?cè)谶\(yùn)行時(shí)或者在隨后一個(gè)點(diǎn)上動(dòng)態(tài)地將兩個(gè)或兩個(gè)以上的對(duì)象和它們的屬性一起擴(kuò)展或合并為一個(gè)單一對(duì)象。定義三個(gè)對(duì)象目的是為了裝飾對(duì)象將的額外功能附加到上。 抽象decorator模式 使用jQuery的裝飾者模式 jQuery.extend()允許我們?cè)谶\(yùn)行時(shí)或者在隨后一個(gè)點(diǎn)上動(dòng)態(tài)地將兩個(gè)或兩個(gè)以上的對(duì)象(和它們的屬性)一起擴(kuò)展(或合并)為一個(gè)單一對(duì)象。 定義...

    Joyven 評(píng)論0 收藏0
  • java第三方包學(xué)習(xí)之jsoup

    摘要:下面隆重介紹簡(jiǎn)介是一個(gè)解析的第三方庫,它提供了一套非常方便的,可使用,以及類的操作方法來取出和操作數(shù)據(jù)。一個(gè)文檔的對(duì)象模型文檔由多個(gè)和組成其繼承結(jié)構(gòu)如下繼承繼承繼承一個(gè)包含一個(gè)子節(jié)點(diǎn)集合,并擁有一個(gè)父。 前言 使用python寫爬蟲的人,應(yīng)該都聽過beautifulsoup4這個(gè)包,用來它來解析網(wǎng)頁甚是方便。那么在java里有沒有類似的包呢?當(dāng)然有啦!而且也非常好用。下面隆重介紹jso...

    dackel 評(píng)論0 收藏0
  • 集合框架源碼學(xué)習(xí)之ArrayList

    摘要:用戶自己指定容量創(chuàng)建大小的數(shù)組創(chuàng)建空數(shù)組默認(rèn)構(gòu)造函數(shù),其默認(rèn)初始容量為構(gòu)造一個(gè)包含指定集合的元素的列表,按照它們由集合的迭代器返回的順序。以正確的順序返回該列表中的元素的迭代器。此方法充當(dāng)基于陣列和基于集合的之間的橋梁。 目錄: 0-0-1. 前言 0-0-2. 集合框架知識(shí)回顧 0-0-3. ArrayList簡(jiǎn)介 0-0-4. ArrayList核心源碼 0-0-5. Ar...

    BLUE 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<