$.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.extend
和jquery.fn.extend
指向同乙個函式,在函式內部,對呼叫情況進行區分。首先判斷第乙個引數的型別,確定是否顯式指定深複製。使用target
儲存合併物件的引用,如果target
不是物件的,要指向空物件。
接著判斷引數的個數,區別jquery.extend
或jquery.fn.extend
的呼叫。然後使用for
迴圈,從第二個引數開始遍歷,進行拷貝;拷貝時使用src
儲存target上的屬性,copy
儲存被合併物件上的屬性。使用for...in
迴圈遍歷屬性名進行拷貝,拷貝時忽略對target
自身引用,copy
為空時也會被忽略,如果根據是否需要深拷貝來決定是否對object
和array
遞迴深拷貝。如果是淺拷貝,直接儲存值或引用。
值得一提的是,遍歷被合併物件時使用的是for...in
迴圈,所以傳入string
和array
型別的引數也會被遍歷,在合併後物件中的屬性名為索引。由於遍歷引數是從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 自呼叫函式大家都不陌生...