摘要:源碼學(xué)習(xí)之用于合并對象,可選擇是否深復(fù)制。盡管官方文檔明確指出第一個參數(shù)是的調(diào)用情況并不支持,但是這個版本的源碼中,判斷第一個參數(shù)的類型雖有限定是類型,但卻未對其值真假加以限定。調(diào)用方式源碼和指向同一個函數(shù),在函數(shù)內(nèi)部,對調(diào)用情況進行區(qū)分。
jQuery源碼學(xué)習(xí)之extend
$.extend用于合并對象,可選擇是否深復(fù)制。使用時,第一個參數(shù)為合并后的對象。如果要進行深拷貝,則參數(shù)1為true,參數(shù)2為要合并的目標(biāo)對象。盡管jQuery官方文檔明確指出第一個參數(shù)是false的調(diào)用情況并不支持,但是這個版本的源碼中,判斷第一個參數(shù)的類型雖有限定是boolean類型,但卻未對其值真假加以限定。所以第一個參數(shù)是false也是可行的。
$.fn.extend({})用于拓展jq原型對象,使用只能傳入一個對象,多用于jq插件定義。
調(diào)用方式jQuery.extend( target [, object1 ] [, objectN ] ) Query.extend( [deep ], target, object1 [, objectN ] ) jQuery.fn.extend( object )源碼
jQuery.extend和jQuery.fn.extend指向同一個函數(shù),在函數(shù)內(nèi)部,對調(diào)用情況進行區(qū)分。首先判斷第一個參數(shù)的類型,確定是否顯式指定深復(fù)制。使用target保存合并對象的引用,如果target不是對象的,要指向空對象。
接著判斷參數(shù)的個數(shù),區(qū)別jQuery.extend或jQuery.fn.extend的調(diào)用。然后使用for循環(huán),從第二個參數(shù)開始遍歷,進行拷貝;拷貝時使用src保存target上的屬性,copy保存被合并對象上的屬性。使用for...in循環(huán)遍歷屬性名進行拷貝,拷貝時忽略對target自身引用,copy為空時也會被忽略,如果根據(jù)是否需要深拷貝來決定是否對object和array遞歸深拷貝。如果是淺拷貝,直接保存值或引用。
值得一提的是,遍歷被合并對象時使用的是for...in循環(huán),所以傳入string和array類型的參數(shù)也會被遍歷,在合并后對象中的屬性名為索引。由于遍歷參數(shù)是從target后的第一個參數(shù)開始,所以先傳入的對象會被后傳入對象的同名屬性覆蓋。
jQuery.extend = jQuery.fn.extend = function() { // target是對象或true,從第二個參數(shù)開始遍歷 var options, name, src, copy, copyIsArray, clone, target = arguments[ 0 ] || {}, i = 1, length = arguments.length, deep = false; // Handle a deep copy situation // 第一個參數(shù)如果是boolean,表明顯示指定是否深復(fù)制 if ( typeof target === "boolean" ) { deep = target; // Skip the boolean and the target // 將target指向第一個參數(shù),從第三個參數(shù)開始合并 target = arguments[ i ] || {}; i++; } // Handle case when target is a string or something (possible in deep copy) // 不是對象或函數(shù),將target設(shè)置默認(rèn)空 if ( typeof target !== "object" && !jQuery.isFunction( target ) ) { target = {}; } // Extend jQuery itself if only one argument is passed // 只有一個參數(shù),即$.fn.extend({}),target指向jq原型 if ( i === length ) { target = this; i--; } // 先傳入的對象會被后傳入對象的同名屬性覆蓋 for ( ; i < length; i++ ) { // Only deal with non-null/undefined values // 保存當(dāng)前的非空對象。 if ( ( options = arguments[ i ] ) != null ) { // Extend the base object // 遍歷,for...in會遍歷數(shù)組或字符串 // src為target屬性值,copy為闖入對象的屬性值 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ù)制時,調(diào)用$.extend遞歸調(diào)用。 // 復(fù)制時保存屬性的原始類型,只有對象或數(shù)組才必要進行深復(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)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/96358.html
摘要:回調(diào)隊列中的元素是對象,代表一個事件回調(diào),擁有多個屬性,如等等,其中是回調(diào)函數(shù),在觸發(fā)時通過傳遞,具體的在后面講。類型是時鍵表示事件名,規(guī)則同上,鍵值表示事件觸發(fā)時的回調(diào)函數(shù)。 jQuery源碼學(xué)習(xí)之event jQuery的事件機制為異步回調(diào),事件監(jiān)聽的屬性、參數(shù)和回調(diào)的等保存在Data實例中,在元素上保存該對象的引用。有方法handle,內(nèi)部執(zhí)行dispatch;有屬性events...
摘要:源碼學(xué)習(xí)之的通過回調(diào)實現(xiàn)異步,其實現(xiàn)核心是?;卣{(diào)函數(shù)隊列中的函數(shù)返回時停止觸發(fā)回調(diào)函數(shù)隊列只能被觸發(fā)一次記錄上一次觸發(fā)隊列傳入的值,新添加到隊列中的函數(shù)使用記錄值作為參數(shù),并立即執(zhí)行。實際是,內(nèi)部則調(diào)用了在定義的局部函數(shù)。 jQuery源碼學(xué)習(xí)之Callbacks jQuery的ajax、deferred通過回調(diào)實現(xiàn)異步,其實現(xiàn)核心是Callbacks。 使用方法 使用首先要先新建一個...
摘要:抽象模式使用的裝飾者模式允許我們在運行時或者在隨后一個點上動態(tài)地將兩個或兩個以上的對象和它們的屬性一起擴展或合并為一個單一對象。定義三個對象目的是為了裝飾對象將的額外功能附加到上。 抽象decorator模式 使用jQuery的裝飾者模式 jQuery.extend()允許我們在運行時或者在隨后一個點上動態(tài)地將兩個或兩個以上的對象(和它們的屬性)一起擴展(或合并)為一個單一對象。 定義...
摘要:下面隆重介紹簡介是一個解析的第三方庫,它提供了一套非常方便的,可使用,以及類的操作方法來取出和操作數(shù)據(jù)。一個文檔的對象模型文檔由多個和組成其繼承結(jié)構(gòu)如下繼承繼承繼承一個包含一個子節(jié)點集合,并擁有一個父。 前言 使用python寫爬蟲的人,應(yīng)該都聽過beautifulsoup4這個包,用來它來解析網(wǎng)頁甚是方便。那么在java里有沒有類似的包呢?當(dāng)然有啦!而且也非常好用。下面隆重介紹jso...
摘要:用戶自己指定容量創(chuàng)建大小的數(shù)組創(chuàng)建空數(shù)組默認(rèn)構(gòu)造函數(shù),其默認(rèn)初始容量為構(gòu)造一個包含指定集合的元素的列表,按照它們由集合的迭代器返回的順序。以正確的順序返回該列表中的元素的迭代器。此方法充當(dāng)基于陣列和基于集合的之間的橋梁。 目錄: 0-0-1. 前言 0-0-2. 集合框架知識回顧 0-0-3. ArrayList簡介 0-0-4. ArrayList核心源碼 0-0-5. Ar...
閱讀 2594·2023-04-26 03:00
閱讀 1408·2021-10-12 10:12
閱讀 4203·2021-09-22 15:33
閱讀 2931·2021-09-22 15:06
閱讀 1543·2019-08-30 15:44
閱讀 2155·2019-08-30 13:59
閱讀 543·2019-08-30 11:24
閱讀 2428·2019-08-29 17:07