簡述jQuery實現(xiàn)原理


背景介紹

jQuery可以說是流行最廣谜酒,使用量最多的一個js庫了。它極大的提高了人們工作的效率人灼,解決了困擾人們很久的dom不一致性所帶來的各種問題坐昙。jQuery最大的貢獻就是在dom操作這方面鳖擒,當(dāng)然它還提供其他方面的操作溉浙。下面我們來通過一個小的例子簡單介紹一下jQuery的實現(xiàn)原理。

內(nèi)部結(jié)構(gòu)

jQuery內(nèi)部其實是一個偽數(shù)組對象蒋荚,對象上還綁定一些自帶的屬性戳稽,比如說context,selector等。最重要的是jQuery的原型圆裕,接下來我們講广鳍。

構(gòu)造函數(shù)

jQuery寫成構(gòu)造函數(shù)荆几,把所有的共用屬性寫在JQuery.prototype上吓妆,方便每個示例的調(diào)用,也節(jié)省了大量的內(nèi)存空間吨铸。如果是非構(gòu)造函數(shù)形式調(diào)用行拢,那么就new一個實例并返回。

  window.jQuery = function(nodes){
    //判斷是否使用 new 關(guān)鍵字
    if(this instanceof jQuery){
      this.init(nodes);
    }else {
      return new jQuery(nodes);
    }
  };

獲取節(jié)點

jQuery基于原生的Dom屬性與方法封裝了自己的選擇器方法诞吱。通過選擇器方法舟奠,可以把原生節(jié)點,選擇器字符串轉(zhuǎn)換為jQuery內(nèi)部節(jié)點房维。然后對節(jié)點進行操作沼瘫。由于選擇器方法比較復(fù)雜,我們就用現(xiàn)有的document.querSelectorAll()來代替咙俩,實現(xiàn)的效果相同耿戚。在構(gòu)造函數(shù)初始化的時候就去執(zhí)行這個方法。

  //初始化函數(shù)阿趁,把nodes節(jié)點傳給this
  jQuery.prototype.init = function(nodes){
    var _this = this;
    _this.length = 0;
    if(typeof nodes === 'string'){
      nodes = document.querySelectorAll(nodes);
    }
    for(var i=0;i<nodes.length;i++){
      _this[_this.length] = nodes[i];
      _this.length++;
    }
  };

addClass方法

jQuery有一個addClass方法膜蛔,我們這里模擬一下。不過只是一個簡易版脖阵,了解一下原理即可皂股。首先遍歷所有實例中的節(jié)點對象,然后每個執(zhí)行dom原生提供的classList.add()命黔。

  //添加class
  jQuery.prototype.addClass = function(className){
    var _this = this;
    for(var i = 0;i < _this.length;i++){
      _this[i].classList.add(className)
    }
  };

setText方法

setText方法和addClass方法原理類似呜呐,都要遍歷實例中的節(jié)點對象就斤,然后每個執(zhí)行一遍dom提供的textContent的方法。

  //添加文字
  jQuery.prototype.setText = function(text){
    var _this = this;
    for(var i = 0;i < _this.length;i++){
      _this[i].textContent = text;
    }
  };

window.$

為了使用戶用的方便卵史,最好能像jQuery一樣战转,直接使用$就可以,只需要設(shè)置window.$ = jQuery即可以躯。剛剛已經(jīng)講過內(nèi)部已經(jīng)判斷過是否是通過new 來構(gòu)造實例的槐秧,如果不是,內(nèi)部return new jQuery忧设。

調(diào)用測試

通過以下代碼調(diào)用刁标,基本都實現(xiàn)功能。如果想要實現(xiàn)鏈式調(diào)用址晕,直接在每個方法結(jié)尾return this即可膀懈。

    $('div').addClass('red');
    $('div').setText('h1');

總結(jié)

jQuery內(nèi)部提供了大量的api,如果有興趣,可以自己多實現(xiàn)一些方法谨垃。本文只是簡單介紹一下實現(xiàn)原理與結(jié)構(gòu)启搂。本文內(nèi)容僅供學(xué)習(xí)與交流使用,轉(zhuǎn)載請注明出處刘陶。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末胳赌,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子匙隔,更是在濱河造成了極大的恐慌疑苫,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,470評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件纷责,死亡現(xiàn)場離奇詭異捍掺,居然都是意外死亡,警方通過查閱死者的電腦和手機再膳,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,393評論 3 392
  • 文/潘曉璐 我一進店門挺勿,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人喂柒,你說我怎么就攤上這事不瓶。” “怎么了胳喷?”我有些...
    開封第一講書人閱讀 162,577評論 0 353
  • 文/不壞的土叔 我叫張陵湃番,是天一觀的道長。 經(jīng)常有香客問我吭露,道長吠撮,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,176評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮泥兰,結(jié)果婚禮上弄屡,老公的妹妹穿的比我還像新娘。我一直安慰自己鞋诗,他們只是感情好膀捷,可當(dāng)我...
    茶點故事閱讀 67,189評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著削彬,像睡著了一般全庸。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上融痛,一...
    開封第一講書人閱讀 51,155評論 1 299
  • 那天壶笼,我揣著相機與錄音,去河邊找鬼雁刷。 笑死覆劈,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的沛励。 我是一名探鬼主播责语,決...
    沈念sama閱讀 40,041評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼目派!你這毒婦竟也來了坤候?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,903評論 0 274
  • 序言:老撾萬榮一對情侶失蹤址貌,失蹤者是張志新(化名)和其女友劉穎铐拐,沒想到半個月后徘键,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體练对,經(jīng)...
    沈念sama閱讀 45,319評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,539評論 2 332
  • 正文 我和宋清朗相戀三年吹害,在試婚紗的時候發(fā)現(xiàn)自己被綠了螟凭。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,703評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡它呀,死狀恐怖螺男,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情纵穿,我是刑警寧澤下隧,帶...
    沈念sama閱讀 35,417評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站谓媒,受9級特大地震影響淆院,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜句惯,卻給世界環(huán)境...
    茶點故事閱讀 41,013評論 3 325
  • 文/蒙蒙 一土辩、第九天 我趴在偏房一處隱蔽的房頂上張望支救。 院中可真熱鬧,春花似錦拷淘、人聲如沸各墨。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,664評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽贬堵。三九已至,卻和暖如春结洼,著一層夾襖步出監(jiān)牢的瞬間扁瓢,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,818評論 1 269
  • 我被黑心中介騙來泰國打工补君, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留引几,地道東北人。 一個月前我還...
    沈念sama閱讀 47,711評論 2 368
  • 正文 我出身青樓挽铁,卻偏偏與公主長得像伟桅,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子叽掘,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,601評論 2 353

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

  • 1.JQuery 基礎(chǔ) 改變web開發(fā)人員創(chuàng)造搞交互性界面的方式楣铁。設(shè)計者無需花費時間糾纏JS復(fù)雜的高級特性。 1....
    LaBaby_閱讀 1,171評論 0 1
  • 1.JQuery 基礎(chǔ) 改變web開發(fā)人員創(chuàng)造搞交互性界面的方式更扁。設(shè)計者無需花費時間糾纏JS復(fù)雜的高級特性盖腕。 1....
    LaBaby_閱讀 1,335評論 0 2
  • 一、樣式篇 第1章 初識jQuery (1)環(huán)境搭建 進入官方網(wǎng)站獲取最新的版本 http://jquery.co...
    凜0_0閱讀 3,380評論 0 44
  • 最近脾氣差的像炸藥包浓镜。 好像火一上來溃列,覺得對面就是天王老子也得炸個粉碎。 都是家里人慣出來的毛病膛薛,最可怕的是誤以為...
    呆小瞇眼閱讀 127評論 1 0
  • 夜幕悄悄降臨听隐,帝都里已是燈火闌珊,握一杯清茶哄啄,靜等靈魂慢慢聚攏雅任,和自己做一場心靈的對話。 白天的人潮洶涌中把自己交...
    浮華世間遇見淡然四季閱讀 301評論 0 1