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


背景介紹

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

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

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

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

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

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

獲取節(jié)點(diǎn)

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

  //初始化函數(shù),把nodes節(jié)點(diǎn)傳給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有一個(gè)addClass方法,我們這里模擬一下。不過只是一個(gè)簡易版,了解一下原理即可。首先遍歷所有實(shí)例中的節(jié)點(diǎn)對象,然后每個(gè)執(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方法原理類似,都要遍歷實(shí)例中的節(jié)點(diǎn)對象,然后每個(gè)執(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)造實(shí)例的,如果不是,內(nèi)部return new jQuery。

調(diào)用測試

通過以下代碼調(diào)用,基本都實(shí)現(xiàn)功能。如果想要實(shí)現(xiàn)鏈?zhǔn)秸{(diào)用,直接在每個(gè)方法結(jié)尾return this即可。

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

總結(jié)

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

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

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

友情鏈接更多精彩內(nèi)容