淺析jQuery的鏈?zhǔn)秸{(diào)用之each函數(shù)
接下來言歸正傳.....說正經(jīng)的
由于$()函數(shù)返回的是一個(gè)包裹了原生dom對(duì)象數(shù)組的對(duì)象,并且在此對(duì)象原型上擴(kuò)展的函數(shù)都是為了操作原生的dom對(duì)象,所以少不了循環(huán)遍歷的操作,熟悉jquery庫的人都知道有個(gè)jQuery.each()函數(shù) ,大部分的涉及jquery對(duì)象的函數(shù)都會(huì)用到這個(gè)函數(shù): 簡(jiǎn)單的實(shí)現(xiàn)應(yīng)該是形如這樣:
(再次重申,只是簡(jiǎn)單的實(shí)現(xiàn)原理,不要考慮具體的功能性問題)
if (!window['$'])
window['$'] = window['jQuery'];
/*這里以上區(qū)域?yàn)樯弦黄恼碌拈]包內(nèi)的內(nèi)容
* 定義jQuery.each 根據(jù)傳入對(duì)象來執(zhí)行操作
* @param {Object} obj
* @param {Object} func
*簡(jiǎn)單起見我只考慮了數(shù)組以及jQuery對(duì)象兩種情況,跟上一篇一樣,原理應(yīng)該是一致的
*/
window['jQuery']['each']=function(obj,func){
if(obj.constructor==Array){
for(var i=0;i<obj.length;i++){
func.call(obj[i],i,obj[i]);//可以看到傳入的func 應(yīng)該是形如function(i,item) i代表遍歷到的下標(biāo),item則代表在數(shù)組中遍歷到的對(duì)象
}
}else if(obj.elements&&obj.elements.constructor==Array){//這里采用了傳說的鴨子法則,而不是判定它是不是jQuery的實(shí)例 只要你有Array類型的elements我就對(duì)你進(jìn)行操作
for(var i=0;i<obj.elements.length;i++){
func.call(obj.elements[i],i,obj.elements[i]);//可以看到傳入的func 應(yīng)該是形如function(i,item) i代表遍歷到的下標(biāo),item則代表在數(shù)組中遍歷到的對(duì)象
}
}else{
return null;
}
}
在這個(gè)函數(shù)的基礎(chǔ)之上可以開始擴(kuò)充_jQuery的prototype了;首先就是先寫一個(gè)包裝器對(duì)象可以直接調(diào)用的方法each:(這個(gè)并不是重復(fù)),然后通過調(diào)用這個(gè)each函數(shù)可以完成對(duì)對(duì)象數(shù)組的遍歷,
比如:
//寫在閉包內(nèi) 注意將昨天命名沖突了的jQuery構(gòu)造函數(shù)名稱改為_jQuery
_jQuery.prototype = {
each: function(func){
jQuery.each(this, func);
return this;
},
attr: function(key, value){
//示例定義這個(gè)set與get于一身的操作屬性的函數(shù)
if (arguments.length == 0) {
return null;
}
else
if (arguments.length == 1) {
return this.elements[0].getAttribute(key);
}
else if(arguments.length == 2){
this.each(function(i, item){
//這里可以看到重新定義each方法的好處一:精簡(jiǎn)代碼 ,二:在內(nèi)部函數(shù)中this仍然是指向調(diào)用的包裝器對(duì)象而不是window
item.setAttribute(key, value);
})
}
}
/*
* 這里可以開始引入其他方法
*/
}
接下來做幾個(gè)簡(jiǎn)單的測(cè)試:(還是上一篇的測(cè)試html)
輸入:
var k= $('#header');
consoles.write(k.attr('title','test title!').attr('title')); //鏈?zhǔn)秸{(diào)用
輸出:
test title!
依此類推,依靠each方法可以有效的擴(kuò)充包裝器的方法。
之前說的影響到j(luò)Query的鏈?zhǔn)秸{(diào)用的要點(diǎn)有三點(diǎn),事實(shí)事后一想完全不是那么簡(jiǎn)單,jQuery內(nèi)部代碼的維護(hù)感覺并不比有些庫好,雖然至少在操作上來講使用起來非常順手(當(dāng)然只是針對(duì)一些小的操作,大的項(xiàng)目一時(shí)也無法接觸到,也不好跟著一些大大人云亦云). 不過就算僅僅從遍歷操作來看, 也可以看到其實(shí)這個(gè)庫只能依托細(xì)化的插件,擴(kuò)充下去只會(huì)顯得臃腫不堪。
注:如果有仔細(xì)剖析了jquery源碼的人肯定會(huì)對(duì)我如此拙劣的所謂的實(shí)現(xiàn)嗤之以鼻,我的確只是看了幾本比如javascript dom高級(jí)程序設(shè)計(jì) 以及javascript 高級(jí)程序設(shè)計(jì) 設(shè)計(jì)模式等好書之后有感而發(fā)而已,可能跟具體的jquery的實(shí)現(xiàn)有很大的落差,可以的話希望可以指正一下。
相關(guān)文章
jquery 獲取select數(shù)組與name數(shù)組長(zhǎng)度的實(shí)現(xiàn)代碼
下面小編就為大家?guī)硪黄猨query 獲取select數(shù)組與name數(shù)組長(zhǎng)度的實(shí)現(xiàn)代碼。小編覺得挺不錯(cuò)的, 現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2016-06-06jquery 多行滾動(dòng)代碼(附詳細(xì)解釋)
在網(wǎng)上可以隨處找到這段代碼,但是沒有任何人解釋這段代碼,只要自己研究好久。2010-06-06jquery模擬多級(jí)復(fù)選框效果的簡(jiǎn)單實(shí)例
下面小編就為大家?guī)硪黄猨query模擬多級(jí)復(fù)選框效果的簡(jiǎn)單實(shí)例。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2016-06-06jQuery學(xué)習(xí)筆記——jqGrid的使用記錄(實(shí)現(xiàn)分頁、搜索功能)
這篇文章主要介紹了jQuery學(xué)習(xí)筆記——jqGrid的使用記錄(實(shí)現(xiàn)分頁、搜索功能),想要學(xué)習(xí)jQuery的可以了解一下。2016-11-11javascript 開發(fā)之網(wǎng)頁兼容各種瀏覽器
這篇文章主要介紹了javascript 開發(fā)之網(wǎng)頁兼容各種瀏覽器的相關(guān)資料,這里提供了幾種方法幫助大家掌握這樣的功能,需要的朋友可以參考下2017-09-09jQuery的選擇器中的通配符[id^=''code'']或[name^=''code'']及jquery選擇器總結(jié)
這篇文章主要介紹了jQuery的選擇器中的通配符[id^='code']或[name^='code']及jquery選擇器總結(jié)的相關(guān)資料,需要的朋友可以參考下2015-12-12