jquery擴展函數是什么,相信很多沒有經驗的人對此束手無策,為此本文總結了問題出現的原因和解決方法,通過這篇文章希望你能解決這個問題。
上次分析了jquery的源碼,分享了jquery的核心框架架構,這一次我們拋開源碼,只關注功能,來看一下jquery的擴展函數的使用到底有何神奇之處。
為了看起來方便,我將所有的講解都附在了代碼中,這樣看起來會更直觀,由于我將多種測試放在一個頁面當中,所以會有很多alert彈出,這里各位在測試的時候,可以將其中的功能分開來放,這樣可以更加直觀的看到效果。
好了,現在就看一下jquery的擴展函數與我的人生吧。
<html>
<head>
<script src="jquery-1.8.2.js" type="text/javascript"></script>
<script type="text/javascript">
/*
*jquery的extend方法的原版形式,jquery.extend(deep,target,source1,source2......)以及
*jquery.fn.extend(deep,target,source1,source2......),下面分別演示兩個函數的區別與相同之處。
*參數詳解:
*deep:boolean類型,意為是否要深度拷貝
*target:Object類型,意為要擴展的目標對象
*source1:Object類型,意為被擴展的資源對象
*source2....:與source1相同,理論上可以有無限個
*/
//此處擴展的是$(即jQuery,以后都用$),當只有一個Object類型參數的時候,此方法擴展$。
$.extend(
{
testExtend:function(){
alert('extend success');
}
}
);
//此處擴展的是$()(即jQuery對象,以后都用$()),當只有一個Object類型參數的時候,此方法擴展$()。
$.fn.extend(
{
testFnExtend:function(){
alert('extend fn success');
}
}
);
//此處將成功彈出
$.testExtend();
//此處將報錯,所以我們用try{}catch{}包圍起來看錯誤信息,將提示錯誤。
try{
$("testDiv").testExtend();
}catch(e){
alert(e.toString());
}
//反過來也是一樣,此處將成功彈出
$("testDiv").testFnExtend();
//此處將報錯,所以我們用try{}catch{}包圍起來看錯誤信息,將提示錯誤。
try{
$.testFnExtend();
}catch(e){
alert(e.toString());
}
//下面將演示不擴展$或者$()的情況,即我們設定一個目標對象
var target = {};//目標對象
//此處target將作為目標對象擴展
$.extend(target,
{
testExtend:function(){
alert('extend success');
}
}
);
//擴展成功后,target具有testExtend方法
target.testExtend();
//下面我們看下兩個方法的作用是否相同
var targetFn = {};//目標對象
//此處targetFn將作為目標對象擴展
$.fn.extend(targetFn,
{
testExtend:function(){
alert('extend success');
}
}
);
//targetFn被成功擴展,擴展成功后,targetFn具有testExtend方法,說明指定了target,二者效果相同,用哪個都一樣
targetFn.testExtend();
/*最后我們來看下深度拷貝的含義,深度拷貝用文字來解釋的意思是,當被擴展的屬性如果也是一個對象的時候,那么也會
*將該屬性作為對象來擴展,而不會覆蓋屬性的對象中原有的屬性。
*這個文字解釋略顯蒼白,我們來看一下實際的效果會如何。
*/
//首先我們需要一個對象,這個對象的某一個屬性又是一個對象。
//為了便于理解,這次我們采用現實當中的例子,我將為技術獻身,以下純屬虛構。
var me = {
name:"zuoxiaolong",
sex:"man",
//注意,這里我的女朋友,我的屬性,也是一個對象
girlFriend:{
name:"secret",
sex:"woman"
}
};
//下面首先采用非深度拷貝的方式對我進行擴展,此處不再區分$.extend和$.fn.extend,因為二者在有目標對象的情況下,效果相同
$.extend(me,
{
work:"programmer",//擴展我的工作為程序員
girlFriend:{
work:"rich"//擴展我女朋友的職業為富婆,這是不是若干人群的夢想
}
}
);
//我們來看下非深度拷貝,擴展以后的結果,我的生活會變成什么樣子
alert("name:" + me.name);
alert("sex:" + me.sex);
alert("work:" + me.work);
//特別注意我的女朋友被擴展的結果
alert("girlFriend.name:" + me.girlFriend.name);
alert("girlFriend.sex:" + me.girlFriend.sex);
alert("girlFriend.work:" + me.girlFriend.work);
/*
*是不是發現我女朋友的名字和性別都未知了,這是因為在非深度拷貝的情況下,如
*果屬性為對象,將會被擴展的屬性值直接覆蓋掉,也就是原來的屬性name和sex會被直接覆蓋,即name和sex會被work覆蓋
*/
//我當然不能讓我的生活如此悲催,一個連性別都不知道的富婆如何做我的女友,我們來看下神奇的深度拷貝
//這里我們需要重新定義me這個對象,因為之前已經被擴展了,這里要將我的生活重新來過
me = {
name:"zuoxiaolong",
sex:"man",
girlFriend:{
name:"secret",
sex:"woman"
}
};
//注意,增加了第一個參數,deep為true,即深度拷貝
$.extend(true,me,
{
work:"programmer",//依然擴展我的工作為程序員
girlFriend:{
name:"chaolu",//當有相同屬性名的時候會被覆蓋
work:"manager"//當有多出的屬性名的時候會被擴展,擴展我女朋友的職業為經理
}
}
);
//我們來重新查看一下擴展后的對象,看我的生活是否恢復正常
alert("name:" + me.name);
alert("sex:" + me.sex);
alert("work:" + me.work);
//特別注意我的女朋友被擴展的結果
alert("girlFriend.name:" + me.girlFriend.name);
alert("girlFriend.sex:" + me.girlFriend.sex);
alert("girlFriend.work:" + me.girlFriend.work);
//我的生活已經恢復正常,一切都完美了
//以上為屬性為對象時的情況,那么當屬性為數組時,則會以數組的下標進行覆蓋和擴展
//文字解釋依舊蒼白,我們來看例子,我將依然獻身給技術
me = {
name:"zuoxiaolong",
sex:"man",
//這里注意,我的好朋友是一個數組
goodFriends:["xubo","xiaochen","xiaoqiang"]
};
//下面我們來看下深度拷貝對數組的影響
//第一個參數為true,深度拷貝
$.extend(true,me,
{
work:"programmer",//依然擴展我的工作為程序員
goodFriends:["shiqiang","andi","liulei"]
}
);
//我的工作將被正常擴展
alert("name:" + me.name);
alert("sex:" + me.sex);
alert("work:" + me.work);
//主要關注我的好朋友的變化,這里或許有的人會以為在深度拷貝的情況下,我的好朋友將成為六個人,我們看結果
alert("goodFriends:" + me.goodFriends);
//結果顯示我原來的三個好朋友沒有了,這里解釋下為何在深度拷貝的情況下,會覆蓋我原來的朋友,剛才我已經解釋過
//對數組的深度拷貝會以下標進行判斷,所以說雖然是深度拷貝,但是后面擴展的goodFriends[0]和前面定義的goodFriends[0],將
//會被認為是同一個屬性名,所以依據同名替換的原理,這里我原來的朋友將會被替換。
//你或許會說,那能不能將六個人都擴展為我的好朋友。答案是否定的,這樣直接擴展,無論如何,前三個位置都將會被擴展的頭三個好朋友覆蓋。
//人生總是不完美的,有了新的好朋友,舊的朋友就容易被遺忘,但是只要你努力,你可以同時擁有,就像下面這樣
me = {
name:"zuoxiaolong",
sex:"man",
//這里注意,我的好朋友是一個數組
goodFriends:["xubo","xiaochen","xiaoqiang"]
};
var newGoodFriends = ["shiqiang","andi","liulei"];
var nowGoodFriends = me.goodFriends.concat(newGoodFriends);//將原來的好朋友與新的好朋友努力連接在一起
//第一個參數取消,非深度拷貝,因為我們已經復制了前三個好朋友,雖然會被覆蓋,但我們已經保存
$.extend(true,me,
{
work:"programmer",//依然擴展我的工作為程序員
goodFriends:nowGoodFriends
}
);
//我的工作將被正常擴展
alert("name:" + me.name);
alert("sex:" + me.sex);
alert("work:" + me.work);
//再次關注我的好朋友的變化,我們看結果
alert("goodFriends:" + me.goodFriends);
//總結,人生有得到就有失去,但有些我們可以通過努力留住很多
//從以上結果我們可以看出,當屬性為數組時,如果source屬性中數組的長度大于target目標對象屬性中數組的長度,那么無論是否深度拷貝,
//都將徹底覆蓋原有的數組元素,那么如果source屬性中數組的長度小于target目標對象屬性中數組的長度,是否深度拷貝是否會影響結果呢。
//答案是肯定的,當出現上述情況時,如果非深度拷貝,將直接覆蓋原有屬性的數組,如果為深度拷貝,則會留下原有數組多出的元素。
//下面看示例,依舊恢復我的生活
me = {
name:"zuoxiaolong",
sex:"man",
//這里注意,我的好朋友是一個數組
goodFriends:["xubo","xiaochen","xiaoqiang"]
};
//注意,此處為非深度拷貝,這時將覆蓋原有數組
$.extend(me,
{
work:"programmer",//依然擴展我的工作為程序員
goodFriends:["shiqiang","andi"]//此處注意,這里將要擴展的數組長度小于原來的長度
}
);
//我的工作將被正常擴展
alert("name:" + me.name);
alert("sex:" + me.sex);
alert("work:" + me.work);
//再次關注我的好朋友的變化,我們看結果,是否會將原有的好朋友全部覆蓋
alert("goodFriends:" + me.goodFriends);
//結果顯示,非深度拷貝,將直接覆蓋原有的數組,我的好朋友開始減少,我們來看深度拷貝會出現什么情況
//依舊恢復我的生活
me = {
name:"zuoxiaolong",
sex:"man",
//這里注意,我的好朋友是一個數組
goodFriends:["xubo","xiaochen","xiaoqiang"]
};
//注意,此處添加深度拷貝deep為true,這時將覆蓋原有數組的相同部分,多余部分保存
$.extend(true,me,
{
work:"programmer",//依然擴展我的工作為程序員
goodFriends:["shiqiang","andi"]
}
);
//我的工作將被正常擴展
alert("name:" + me.name);
alert("sex:" + me.sex);
alert("work:" + me.work);
//再次關注我的好朋友的變化,我們看結果,是否會留下多余的部分的好朋友,也就是這位叫"xiaoqiang"的朋友
alert("goodFriends:" + me.goodFriends);
//從結果中看到,前兩個好朋友被后面的擴展所替代,但是在深度拷貝下,最后的第三個好朋友將會被留存
//從這里我們看出,當source屬性中數組的長度小于target屬性中數組的長度時,是否深度拷貝則會影響結果,反之則不會影響。
</script>
</head>
<body>
<h3 id="testDiv">jquery extend test</h3>
</body>
</html>jquery將我的人生顛覆好幾次,我們總要來一下人生的總結,下面我們來整體的看一下這兩個擴展函數:
1.當第一個參數為boolean類型時,將指示是否深度拷貝。
2.當參數中只有一個Objec類型的時候,$.extend擴展的是$,$.fn.extend擴展的是$()。
3.當參數中有兩個或兩個以上的Object類型的時候,第一個Object類型的參數將作為target被擴展,而后面所有的Object類型的參數的屬性都將被添加到target當中。
總結下深度拷貝:
1.當出現屬性為對象時,如果選擇深度拷貝,則會覆蓋同名的屬性,擴展多出的屬性。否則,則直接覆蓋整個對象。
2.當出現屬性為數組時,如果選擇深度拷貝,則會覆蓋同索引的屬性,如果有多出的屬性,則保留。否則,則直接覆蓋整個數組。
看完上述內容,你們掌握jquery擴展函數是什么的方法了嗎?如果還想學到更多技能或想了解更多相關內容,歡迎關注億速云行業資訊頻道,感謝各位的閱讀!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。