https://segmentfault.com/a/1190000004082170
方法介紹
jQuery 的 API 手冊中,extend 方法掛載在 jQuery 和 jQuery.fn 兩個不同的對象上,但在 jQuery 內(nèi)部代碼實現(xiàn)的是相同的衫冻,只是功能各不相同袒炉。
先看看官方給出的解釋:
jQuery.extendMerge the contents of two or more objects together into the first object. 把兩個或者多個對象合并到第一個對象當中欺嗤;
jQuery.fn.extendMerge the contents of an object onto the jQuery prototype to provide new jQuery instance methods. 把對象掛載到 jQuery 的 prototype 上以擴展一個新的 jQuery實例方法灰羽。
雖然官方對jQuery.extend的擴展方法功能只字未提,但是它也同樣具有擴展 jQuery類方法的功能惭蟋。
合并對象
首先,我先來介紹一下 extend 函數(shù)在合并對象方面的用法药磺。
jQuery.extend(target[, object1][, objectN])
合并 object1 ... objectN 到 target 對象告组,如果只有一個參數(shù),則該 target 對象會被合并到 jQuery 對象中癌佩。
varobj1 = {name:'Tom',age:21}varobj2 = {name:'Jerry',sex:'boy'}$.extend(obj1, obj2);//{name:"Jerry",age:21,sex:"boy"}obj1//{name:"Jerry",age:21,sex:"boy"}obj2//{name:"Jerry",sex:"boy"}
上述代碼展示的是將 obj2 對象合并到 obj1 對象中木缝,這種方法會改變obj1 對象的結構。如果你不想改變合并目標對象的結構围辙,你可以這么做氨肌。
varobj1 = {name:'Tom',age:21}varobj2 = {name:'Jerry',sex:'boy'}$.extend({}, obj1, obj2);//{name:"Jerry",age:21,sex:"boy"}obj1//{name:"Tom",age:21}obj2//{name:"Jerry",sex:"boy"}
深淺拷貝
jQuery.extend([deep],target,object1[, objectN])
和上面的講述的不同的是,該方法多了一個類型為 boolean 的 [deep] 傳參酌畜,當其為 true 時怎囚,將 object1 , objectN深度復制后合并到 target 中。
首先,我們理解一下什么叫做深度復制恳守】加ぃ看看其和淺度復制有什么區(qū)別。
var obj1 = {name:"John",location:{city:"Boston",county:"USA"}}var obj2 = {last:"Resig",location:{state:"MA",county:"China"}}$.extend(false, {}, obj1, obj2);//{name:"John",last:"Resig",location:{state:"MA",county:"China"}}$.extend(true, {}, obj1, obj2);//{name:"John",last:"Resig",location:{city:"Boston",state:"MA",county:"China"}}
由此可見催烘,執(zhí)行深度復制會遞歸遍歷每個對象中含有復雜對象(如:數(shù)組沥阱、函數(shù)、json對象等)的屬性值進行復制伊群,而且淺度復制便不會這么做考杉。
方法擴展
上述的 extend 方法中的 target 參數(shù)是可以省略的。如果省略了舰始,則該方法就只能傳入一個 object 參數(shù)崇棠,該方法功能是將該 object 合并到調(diào)用 extend 方法的對象中。
我們通常會使用這種方式來對 jQuer進行一些方法上的擴展丸卷。