深入理解jQuery

自我封裝jQuery代碼

window.jQuery = function(nodeOrSelector) {
  let nodes = {}
  if (typeof nodeOrSelector === 'string') {
    let tmp = document.querySelectorAll(nodeOrSelector);
    for(var i =0; i < tmp.length; i++){
      nodes[i] = tmp[i];
    }
    nodes.length = i;
  } else if (nodeOrSelector instanceof Node) {
    nodes = {
      0: nodeOrSelector,
      length: 1
    }
  }
  nodes.addClass = function(classs) {
    for (let i = 0; i < nodes.length; i++) {
      nodes[i].classList.add(classs);
    }
  }
  nodes.setText = function(text){
    for (let i = 0; i < nodes.length; i++) {
        nodes[i].textContent = text;
      }
  }
  return nodes;
}

window.$ = jQuery

var $div = $('div')
$div.addClass('red') // 可將所有 div 的 class 添加一個 red
$div.setText('222') // 可將所有 div 的 textContent 變?yōu)?hi

代碼實現(xiàn)過程

window.jQuery = function(nodeOrSelector) 
  • 一般我們的得到的元素都是一個dom對象,而這個對象最終繼承的就是Node接口
  • 所以可以在 Node.prototype 上添加以上 addClass 及setText 方法
  • 但是Node.prototype 是一個共有對象,每個人寫的程序都不一樣絮供, 如果大家都在這里面操作添加刪除API , 就會出現(xiàn)各種問題
  • 所以我們可以取一個我們自己喜歡的名字來當(dāng)作我們簡便操作dom樹似舵,這個構(gòu)造函數(shù)就不會被別人亂修改啦劝枣,而jQuery的作者就取名叫jQuery的
  • 為了更懶更簡便的操作男韧,所以讓$ = jQuery
let nodes = {}
  if (typeof nodeOrSelector === 'string') {
    let tmp = document.querySelectorAll(nodeOrSelector);
    for(var i =0; i < tmp.length; i++){
      nodes[i] = tmp[i];
    }
    nodes.length = i;
  } else if (nodeOrSelector instanceof Node) {
    nodes = {
      0: nodeOrSelector,
      length: 1
    }
  }
  • 因為jQuery 傳入的有可能是字符串形式的選擇器 或者 節(jié)點元素氢哮,所以 這段代碼實現(xiàn)的功能是
  • 先創(chuàng)建一個對象
  • 判斷傳入的參數(shù)是字符串還是dom對象
  • 如果是字符串就document.querySelectorAll匹配所有符合的選擇器的元素,然后改成jQuery形式的對象诬烹,也就是我們開始創(chuàng)建的對象砸烦,不能直接復(fù)制給這個對象,因為匹配得到的對象是NodeList對象绞吁,是dom類型對象
  • 如果是節(jié)點元素就直接添加進(jìn)第一項就好了
  • 因為jQuery ,$div[0] === div
nodes.addClass = function(classs) {
    for (let i = 0; i < nodes.length; i++) {
      nodes[i].classList.add(classs);
    }
  }
  nodes.setText = function(text){
    for (let i = 0; i < nodes.length; i++) {
        nodes[i].textContent = text;
      }
  }
  return nodes;
  • 最后就是給這個要返回的對象添加API啦
  • 真正的jQuery的API都是封裝在jQuery.prototype中幢痘,所有的jQuery對象都共用這些API
  • 這里的nodes就與兩個方法之間產(chǎn)生了閉包, 保護(hù)了nodes的私有化
window.$ = jQuery

var $div = $('div')
$div.addClass('red') // 可將所有 div 的 class 添加一個 red
$div.setText('222') // 可將所有 div 的 textContent 變?yōu)?hi
  • 為了更方便的操作 用$代替jQuery 家破,var $div = $('div') 可以 var $div = jQuery('div') 也是一樣的
  • 構(gòu)造函數(shù)返回的對象就包含了兩個方法颜说, 我們就可以直接調(diào)用啦,
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末汰聋,一起剝皮案震驚了整個濱河市门粪,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌烹困,老刑警劉巖玄妈,帶你破解...
    沈念sama閱讀 218,525評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異髓梅,居然都是意外死亡措近,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,203評論 3 395
  • 文/潘曉璐 我一進(jìn)店門女淑,熙熙樓的掌柜王于貴愁眉苦臉地迎上來瞭郑,“玉大人,你說我怎么就攤上這事鸭你∏牛” “怎么了?”我有些...
    開封第一講書人閱讀 164,862評論 0 354
  • 文/不壞的土叔 我叫張陵袱巨,是天一觀的道長阁谆。 經(jīng)常有香客問我,道長愉老,這世上最難降的妖魔是什么场绿? 我笑而不...
    開封第一講書人閱讀 58,728評論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮嫉入,結(jié)果婚禮上焰盗,老公的妹妹穿的比我還像新娘。我一直安慰自己咒林,他們只是感情好熬拒,可當(dāng)我...
    茶點故事閱讀 67,743評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著垫竞,像睡著了一般澎粟。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,590評論 1 305
  • 那天活烙,我揣著相機(jī)與錄音徐裸,去河邊找鬼。 笑死啸盏,一個胖子當(dāng)著我的面吹牛倦逐,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播宫补,決...
    沈念sama閱讀 40,330評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼曾我!你這毒婦竟也來了粉怕?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,244評論 0 276
  • 序言:老撾萬榮一對情侶失蹤抒巢,失蹤者是張志新(化名)和其女友劉穎贫贝,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體蛉谜,經(jīng)...
    沈念sama閱讀 45,693評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡稚晚,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,885評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了型诚。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片客燕。...
    茶點故事閱讀 40,001評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖狰贯,靈堂內(nèi)的尸體忽然破棺而出也搓,到底是詐尸還是另有隱情,我是刑警寧澤涵紊,帶...
    沈念sama閱讀 35,723評論 5 346
  • 正文 年R本政府宣布傍妒,位于F島的核電站,受9級特大地震影響摸柄,放射性物質(zhì)發(fā)生泄漏颤练。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,343評論 3 330
  • 文/蒙蒙 一驱负、第九天 我趴在偏房一處隱蔽的房頂上張望嗦玖。 院中可真熱鬧,春花似錦跃脊、人聲如沸踏揣。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,919評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽捞稿。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間娱局,已是汗流浹背彰亥。 一陣腳步聲響...
    開封第一講書人閱讀 33,042評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留衰齐,地道東北人任斋。 一個月前我還...
    沈念sama閱讀 48,191評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像耻涛,于是被迫代替她去往敵國和親废酷。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,955評論 2 355

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

  • 前端開發(fā)面試題 <a name='preface'>前言</a> 只看問題點這里 看全部問題和答案點這里 本文由我...
    自you是敏感詞閱讀 761評論 0 3
  • <a name='html'>HTML</a> Doctype作用抹缕?標(biāo)準(zhǔn)模式與兼容模式各有什么區(qū)別? (1)澈蟆、<...
    clark124閱讀 3,481評論 1 19
  • @轉(zhuǎn)自GitHub 介紹js的基本數(shù)據(jù)類型。Undefined卓研、Null趴俘、Boolean、Number奏赘、Strin...
    YT_Zou閱讀 1,158評論 0 0
  • 心不曾變愛已散 作者:孤夜芳心 原諒沒有能力的我寥闪,現(xiàn)在還給不了你想要的生活,原諒平庸的我磨淌,現(xiàn)在還是個追夢者疲憋。謝謝你...
    陳霓裳閱讀 254評論 0 25
  • 自2018年01月08日至01月22日 預(yù)注冊白名單免費送糖果柜某。 母語級交易界面、以德級幣種覆蓋敛纲、淘寶級客戶服務(wù)喂击。...
    硬幣資本李笑來閱讀 190評論 0 0