jQuery 之 extend 方法使用

方法介紹

jQuery 的 API 手冊中篮撑,extend 方法掛載在 jQuery 和 jQuery.fn 兩個不同的對象上茁肠,但在 jQuery 內(nèi)部代碼實現(xiàn)的是相同的恋昼,只是功能各不相同拼苍。

先看看官方給出的解釋:

  • jQuery.extend Merge the contents of two or more objects together into the first object. 把兩個或者多個對象合并到第一個對象當中;
  • jQuery.fn.extend Merge 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 對象中。

var obj1 = {
    name: 'Tom',
    age: 21
}

var obj2 = {
    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 對象的結(jié)構(gòu)眶痰。如果你 不想改變 合并目標對象的結(jié)構(gòu),你可以這么做梯啤。

var obj1 = {
    name: 'Tom',
    age: 21
}

var obj2 = {
    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進行一些方法上的擴展。

引子

jQurey 提供了兩種方法擴張方式捺球,分別為jQuery.fn.extend(object)和jQuery.extend(object).

想要搞清楚兩種擴展方式之間的區(qū)別的話缸浦,先要了解什么是jQuery.fn.

本猿參考了 jQuery 的源碼,發(fā)現(xiàn)其中玄機:

jQuery.fn = jQuery.prototype = {   
    init: function(selector, context) {
        // ...
    };
}

jQuery.fn = jQuery.prototype這句代碼明確指出jQuery.fn指代的就是 jQuery 的原型氮兵。

其次裂逐,我們要引入兩個概念 類方法 和 實例方法 。

  • 類方法 是直接可以使用類引用泣栈,不需要實例化就可以使用的方法卜高。一般在項目中 類方法 都是被設置為工具類使用;

  • 實例方法 必須先創(chuàng)建實例南片,然后才能通過實例調(diào)用該 實例方法 掺涛。

    jQuery可以看做是這個封裝得非常好的類,而我們可以使用jQuery選擇器來創(chuàng)建 jQuery 的實例疼进。比如:使 id 選擇器$('#btn')來創(chuàng)建一個實例薪缆。

區(qū)別

jQuery.extend(object)相當于對 類方法 的擴展。

jQuery.extend({
    /* 返回兩個元素中較小的值 */
    min: function(a, b) {
        return a < b ? a : b;
    },
    /* 返回兩個元素中較大的值 */
    max: function(a, b) {
        return a > b ? a : b;
    }
});

jQuery.min(2, 3); // 2 
jQuery.max(4, 5); // 5

jQuery.fn.extend(object)是對jQuery.prototype上的擴展伞广。

jQuery.fn.extend = jQuery.prototype.extend

這種方式相當對 實例方法 的擴展拣帽。

舉個栗子:

開發(fā)一個簡單的小功能,使用該方法可以使選定元素內(nèi)的文字變紅赔癌。

$.fn.extend({
    setRed: function() {
        $(this).css("color", "red");
    }
});

$('.tip').setRed();

$(".tip")創(chuàng)建了一個jQuery實例诞外,通過它可以調(diào)用成員方法setRed.

上述代碼可以實現(xiàn)預想的擴展,但最好返回this 以滿足 jQuery 鏈式操作 的需要灾票。

改良之后峡谊,代碼如下:

$.fn.extend({
    red: function() {
        return $(this).css("color", "red");
    }
});

本文摘自

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市刊苍,隨后出現(xiàn)的幾起案子既们,更是在濱河造成了極大的恐慌,老刑警劉巖正什,帶你破解...
    沈念sama閱讀 222,729評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件啥纸,死亡現(xiàn)場離奇詭異,居然都是意外死亡婴氮,警方通過查閱死者的電腦和手機斯棒,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,226評論 3 399
  • 文/潘曉璐 我一進店門盾致,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人荣暮,你說我怎么就攤上這事庭惜。” “怎么了?”我有些...
    開封第一講書人閱讀 169,461評論 0 362
  • 文/不壞的土叔 我叫張陵,是天一觀的道長初婆。 經(jīng)常有香客問我,道長骏啰,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 60,135評論 1 300
  • 正文 為了忘掉前任抽高,我火速辦了婚禮判耕,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘厨内。我一直安慰自己祈秕,他們只是感情好,可當我...
    茶點故事閱讀 69,130評論 6 398
  • 文/花漫 我一把揭開白布雏胃。 她就那樣靜靜地躺著,像睡著了一般志鞍。 火紅的嫁衣襯著肌膚如雪瞭亮。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,736評論 1 312
  • 那天固棚,我揣著相機與錄音统翩,去河邊找鬼。 笑死此洲,一個胖子當著我的面吹牛厂汗,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播呜师,決...
    沈念sama閱讀 41,179評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼娶桦,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了汁汗?” 一聲冷哼從身側(cè)響起衷畦,我...
    開封第一講書人閱讀 40,124評論 0 277
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎知牌,沒想到半個月后祈争,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,657評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡角寸,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,723評論 3 342
  • 正文 我和宋清朗相戀三年菩混,在試婚紗的時候發(fā)現(xiàn)自己被綠了忿墅。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,872評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡沮峡,死狀恐怖疚脐,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情帖烘,我是刑警寧澤亮曹,帶...
    沈念sama閱讀 36,533評論 5 351
  • 正文 年R本政府宣布,位于F島的核電站秘症,受9級特大地震影響照卦,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜乡摹,卻給世界環(huán)境...
    茶點故事閱讀 42,213評論 3 336
  • 文/蒙蒙 一役耕、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧聪廉,春花似錦瞬痘、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,700評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至干签,卻和暖如春津辩,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背容劳。 一陣腳步聲響...
    開封第一講書人閱讀 33,819評論 1 274
  • 我被黑心中介騙來泰國打工喘沿, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人竭贩。 一個月前我還...
    沈念sama閱讀 49,304評論 3 379
  • 正文 我出身青樓蚜印,卻偏偏與公主長得像,于是被迫代替她去往敵國和親留量。 傳聞我的和親對象是個殘疾皇子窄赋,可洞房花燭夜當晚...
    茶點故事閱讀 45,876評論 2 361

推薦閱讀更多精彩內(nèi)容

  • 工廠模式類似于現(xiàn)實生活中的工廠可以產(chǎn)生大量相似的商品,去做同樣的事情肪获,實現(xiàn)同樣的效果;這時候需要使用工廠模式寝凌。簡單...
    舟漁行舟閱讀 7,779評論 2 17
  • 在線閱讀 http://interview.poetries.top[http://interview.poetr...
    程序員poetry閱讀 114,431評論 24 450
  • 請參看我github中的wiki,不定期更新孝赫。https://github.com/ivonzhang/Front...
    zhangivon閱讀 7,137評論 2 19
  • 每天有一些人被抽干较木,剩下一副軀殼。身上留下被灼燒過的印記青柄,仿佛還在哧哧作響伐债;下一秒變得像一灘泥水一樣粘稠预侯,不久后凝...
    wwfm19閱讀 274評論 2 1
  • 遠程辦公 對于遠程辦公萎馅,最早的認識來源于大二所讀的一本書《每周工作四小時》從這本書中,我感受到的是一種自己從來沒有...
    lamix閱讀 518評論 1 2