jQuery原始碼學習之extend

2021-09-13 11:28:28 字數 2397 閱讀 5316

$.extend用於合併物件,可選擇是否深複製。使用時,第乙個引數為合併後的物件。如果要進行深拷貝,則引數1為true,引數2為要合併的目標物件。儘管jquery官方文件明確指出第乙個引數是false的呼叫情況並不支援,但是這個版本的原始碼中,判斷第乙個引數的型別雖有限定是boolean型別,但卻未對其值真假加以限定。所以第乙個引數是false也是可行的。

$.fn.extend({})用於拓展jq原型物件,使用只能傳入乙個物件,多用於jq外掛程式定義。

jquery.extend( target [, object1 ] [, objectn ] )

query.extend( [deep ], target, object1 [, objectn ] )

jquery.fn.extend( object )

jquery.extendjquery.fn.extend指向同乙個函式,在函式內部,對呼叫情況進行區分。首先判斷第乙個引數的型別,確定是否顯式指定深複製。使用target儲存合併物件的引用,如果target不是物件的,要指向空物件。

接著判斷引數的個數,區別jquery.extendjquery.fn.extend的呼叫。然後使用for迴圈,從第二個引數開始遍歷,進行拷貝;拷貝時使用src儲存target上的屬性,copy儲存被合併物件上的屬性。使用for...in迴圈遍歷屬性名進行拷貝,拷貝時忽略對target自身引用,copy為空時也會被忽略,如果根據是否需要深拷貝來決定是否對objectarray遞迴深拷貝。如果是淺拷貝,直接儲存值或引用。

值得一提的是,遍歷被合併物件時使用的是for...in迴圈,所以傳入stringarray型別的引數也會被遍歷,在合併後物件中的屬性名為索引。由於遍歷引數是從target後的第乙個引數開始,所以先傳入的物件會被後傳入物件的同名屬性覆蓋。

jquery.extend = jquery.fn.extend = function() ,

i = 1,

length = arguments.length,

deep = false;

// handle a deep copy situation

// 第乙個引數如果是boolean,表明顯示指定是否深複製

if ( typeof target === "boolean" ) ;

i++;

}// handle case when target is a string or something (possible in deep copy)

// 不是物件或函式,將target設定預設空

if ( typeof target !== "object" && !jquery.isfunction( target ) ) ;

}// extend jquery itself if only one argument is passed

// 只有乙個引數,即$.fn.extend({}),target指向jq原型

if ( i === length )

// 先傳入的物件會被後傳入物件的同名屬性覆蓋

for ( ; i < length; i++ )

// recurse if we're merging plain objects or arrays

// 深複製時,呼叫$.extend遞迴呼叫。

// 複製時儲存屬性的原始型別,只有物件或陣列才必要進行深複製

if ( deep && copy && ( jquery.isplainobject( copy ) ||

( copyisarray = array.isarray( copy ) ) ) ) else ;

}// never move original objects, clone them

target[ name ] = jquery.extend( deep, clone, copy );

// don't bring in undefined values

// 淺複製,值非空直接複製或儲存引用

} else if ( copy !== undefined ) }}

}// return the modified object

return target;

};

jQuery原始碼學習

jquery框架學習 1 定義變數和函式 2 給jq物件,新增一些方法和屬性 3 extend jq的繼承方法 4 jq.extend 擴充套件jq的一些工具方法 5 jq複雜的選擇功能 6 callbacks 回函物件,函式的統一管理 7 deferred 延遲物件,對非同步的乙個統一管理 8 s...

EXT 原始碼學習與研究 一

ext 原始碼學習與研究 一 1.介面卡 ext 原來是yahoo yui js的乙個擴充套件,依賴yui的底層 來處理跨瀏覽器問題.目前,使用者可選擇第三方實現或ext來適配.當然,用ext是最佳選擇.2.核心 核心是構建於適配之上的底層 3.作用域 這說明函式定義在哪並不重要.它可以隨時切換呼叫...

jQuery原始碼學習筆記

整個jquery是乙個自呼叫的匿名函式 1 function global,factory 9return factory w 10 11 else 14 typeof window undefined window this,function window,noglobal 自呼叫函式大家都不陌生...