摘要:源碼學(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.extend和jQuery.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.extend或jQuery.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ì)object和array遞歸深拷貝。如果是淺拷貝,直接保存值或引用。
值得一提的是,遍歷被合并對(duì)象時(shí)使用的是for...in循環(huán),所以傳入string和array類型的參數(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
摘要:回調(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...
摘要:源碼學(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è)...
摘要:抽象模式使用的裝飾者模式允許我們?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ì)象。 定義...
摘要:下面隆重介紹簡(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...
摘要:用戶自己指定容量創(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...
閱讀 2691·2023-04-26 03:00
閱讀 1483·2021-10-12 10:12
閱讀 4327·2021-09-22 15:33
閱讀 2996·2021-09-22 15:06
閱讀 1594·2019-08-30 15:44
閱讀 2200·2019-08-30 13:59
閱讀 576·2019-08-30 11:24
閱讀 2478·2019-08-29 17:07