5-jQuery基本結(jié)構(gòu)分析 工廠函數(shù)的實(shí)現(xiàn) 偽數(shù)組 入口函數(shù)參數(shù)分析/總結(jié) 工具方法的抽取 插件機(jī)制

jQuery基本結(jié)構(gòu)分析

  • 結(jié)構(gòu): 閉包(即時函數(shù))-函數(shù)持有了本不屬于自己的變量
    • 普通函數(shù)也是閉包理解
      • 函數(shù)的訪問規(guī)則-內(nèi)層可以訪問外層的作用域
  • jQuery為什么使用閉包結(jié)構(gòu)
    • 閉包是一個封閉空間, 外層不能訪問內(nèi)層數(shù)據(jù), 可以保護(hù)框架的代碼
    • 把所有的代碼封裝起來, 只提供了兩個全局變量
    • 避免和其他框架產(chǎn)生沖突
  • 參數(shù)window
    • 提高性能(縮短代碼的查找鏈)
    • 為什么形參也是window-方便代碼壓縮(形參替換a,b,c之類的)和混淆
  • 形參undefined-解決兼容性的問題
    • 方便代碼壓縮
    • undefined在IE瀏覽器中有不同的表現(xiàn)形式
      • 正常情況下, console.log(undefined = 5555;) //undefined
      • IE9-之前, undefined可以被修改
        • window.undefined = window.undefined //訪問window的屬性undefined的值(未定義)賦值給window的屬性

工廠函數(shù)的實(shí)現(xiàn)

  • 思考: 框架外部應(yīng)該如何使用這個框架, 應(yīng)該如何獲取這個框架的功能
  • 外部訪問閉包中的數(shù)據(jù):
    • 在閉包中返回函數(shù),在這個返回的函數(shù)中間接訪問閉包中的數(shù)據(jù)
    • 把閉包中的私有數(shù)據(jù)(提供給外部的接口)綁定給全局對象window
    • 提供對外的接口

偽數(shù)組

  • 偽數(shù)組的特點(diǎn)
    1. 本身是對象并非數(shù)組
    2. key從0開始, 依次遞增-可以允許存在另類的key(但是在處理時會被忽略)
    3. 擁有l(wèi)ength屬性, 記錄key的值
    4. 必需擁有l(wèi)ength-1屬性(length-1對鍵值對)
    5. 該對象不是window(window.length記錄的iframe標(biāo)簽的個數(shù))
      • 判斷某個對象是否是window: obj==window.window
  • 偽數(shù)組種類-處理入口函數(shù)為偽數(shù)組的方法
    1. 系統(tǒng)自帶的偽數(shù)組
      • 使用[].push.apply(obj,系統(tǒng)自帶的偽數(shù)組)
    2. 自定義的偽數(shù)組
      • 自定義的偽數(shù)組在IE9以下(IE9-)會報錯, 不能直接用[].push.apply(obj, 自定義偽數(shù)組)來轉(zhuǎn)換
      • 偽數(shù)組-->先轉(zhuǎn)換成數(shù)組-->[].push,apply(obj,數(shù)組);
        • 遍歷obj-arr.push(obj[i])
        • var arr2 = [].slice.apply(obj); 在把a(bǔ)rr2-push進(jìn)去

入口函數(shù)參數(shù)分析

  1. 參數(shù)判斷為假的情況

    • 返回空的jQuery實(shí)例對象
  2. 參數(shù)是字符串(選擇器)

    • 根據(jù)選擇器獲取頁面中所有指定的標(biāo)簽,并且保存到實(shí)例對象中返回
  3. 參數(shù)是字符串(標(biāo)簽)

    • 把參數(shù)中所有的一級標(biāo)簽保存到實(shí)例對象中返回,key從0開始一次遞增,這些標(biāo)簽作為key對應(yīng)的value值保存的
  4. 參數(shù)是數(shù)組

    • 把數(shù)組中所有元素依次取出, 保存為jQ實(shí)例對象的鍵值對返回(key從0開始遞增, 數(shù)組中的元素作為對應(yīng)的value值)
  5. 參數(shù)是偽數(shù)組(結(jié)構(gòu)類似于數(shù)組)

    • 把偽數(shù)組中所有的value值依次取出, 保存jQ實(shí)例對象的鍵值對返回(key從0開始遞增, value作為對應(yīng)key的value值)
  6. 參數(shù)是對象

    • 會把參數(shù)(對象)作為整體保存為key為0對應(yīng)的value值, 返回jQ實(shí)例對象
  7. 參數(shù)是DOM標(biāo)簽(對象)

    • 會把參數(shù)(DOM對象)作為整體保存為key為0對應(yīng)的value值, 返回jQ實(shí)例對象
  8. 參數(shù)是非零數(shù)字

    • 會把參數(shù)(數(shù)字)作為整體保存在key為0對應(yīng)的value值, 返回jQ實(shí)例對象
  9. 布爾類型的值: 同8.

  10. 函數(shù)==監(jiān)聽頁面的加載DOM

    • document.addEventListener(要監(jiān)聽的事件, 事件發(fā)生后的回調(diào)函數(shù))
      • 不兼容IE9-, 會報錯
      • 參數(shù)一: DOMContentLoaded 表示DOM加載完畢
    • 使用document.attachEvent()兼容IE9以下瀏覽器
      • 參數(shù)
        1. 要監(jiān)聽的狀態(tài)(固定: onreadystatechange)
        2. 事件發(fā)生后的回調(diào)函數(shù)

入口函數(shù)參數(shù)分析-總結(jié)

  1. 條件判斷為假: 返回空的jQ實(shí)例對象
  2. 字符串(選擇器 | 標(biāo)簽)
  3. 數(shù)組或者偽數(shù)組:
  4. 對象 | DOM節(jié)點(diǎn) | true | 數(shù)字(非0): 會把傳入的參數(shù)保存為key為0對應(yīng)的value值, 返回
  5. 函數(shù)(待處理)
  6. 思考init方法內(nèi)部的實(shí)現(xiàn)邏輯
    1. 對參數(shù)進(jìn)行類型判斷, 根據(jù)判斷類型的結(jié)果分別處理

工具方法的抽取

  • 方法
    1. 工具對象: 多個方法放在一個對象中

    2. 給構(gòu)造函數(shù)添加靜態(tài)方法(拷貝工具對象的方法-遍歷工具對象進(jìn)行屬性拷貝)

       var obj = {name : 'zs',age : 20,friends:['小明','小紅']};
       var  obj1 = {};
       // 需求:obj1獲取obj的屬性
      
       for(var key in obj){
           obj1[key] = obj[key];
       }
      
    3. 給構(gòu)造函數(shù)的原型對象添加原型方法

  • jQuery實(shí)現(xiàn)
    • jQ.each(); 添加在構(gòu)造函數(shù)自己身上的靜態(tài)方法

    • jQ().each(); 添加在構(gòu)造函數(shù)對應(yīng)的原型對象上面的原型方法

        XDYQuery.prototype.extend  = XDYQuery.extend = function (obj) {
            for(var i in obj)
            {
                this[i] = obj[i];
            }
        }
        //靜態(tài)方法調(diào)用-把工具對象直接作為參數(shù)傳進(jìn)去
        XDYQuery.extend(  {  //...  }  );
      

get(): 獲取指定索引對應(yīng)的標(biāo)簽返回

  • 參數(shù):
    • 如果沒有傳遞參數(shù):獲取頁面中所有指定的標(biāo)簽存儲在數(shù)組中返回 == toArray方法
    • 傳遞參數(shù)
      • 參數(shù)是正數(shù)
      • 參數(shù)是負(fù)數(shù) 如果是-1,表示獲取倒數(shù)第一個(獲取所有指定標(biāo)簽.length+負(fù)值索引)

eq(): 獲取指定索引對應(yīng)的標(biāo)簽并且包裝成jQ對象返回

  • 參數(shù):
    • 沒有參數(shù)(判斷arguments.length == 0):返回一個空的jQ對象(不是this)
    • 傳遞參數(shù)
      • 參數(shù)是正數(shù) ==>$(get)
      • 參數(shù)是負(fù)數(shù)

each()實(shí)現(xiàn)思路

  • each方法的使用

    1. jQ.each(obj | arr,fn(key,value){.....})
    2. jQ().each(fn(key,value){.....})
      • 作用: 遍歷對象 | 數(shù)組 | 偽數(shù)組, 每循環(huán)一次就把當(dāng)前的鍵值對(索引/元素)作為參數(shù)傳遞給后面的回調(diào)函數(shù), 并且執(zhí)行回調(diào)函數(shù)中的代碼
  • jQuery中each()的實(shí)現(xiàn)思路

    1. 遍歷對象 | 數(shù)組 | 偽數(shù)組
      • [1] 遍歷對象 ==> for..in
      • [2] 遍歷數(shù)組 ==> for | for..in (不推薦:包括原型成員) ? |forEach
      • 遍歷偽數(shù)組 ==> for..in | for
    2. 調(diào)用回調(diào)函數(shù)
      • 中斷循環(huán)(遍歷中判回調(diào)函數(shù)的返回值是否為假, 條件為真就結(jié)束循環(huán))
      • 回調(diào)函數(shù)中的this指向的是當(dāng)前循環(huán)的value值(回調(diào)函數(shù)借用call方法設(shè)置this指向value值)

jQuery中map()實(shí)現(xiàn)思路

  • jQ.map(arr,fn(index,value))
    • 作用:變量數(shù)組,在回調(diào)函數(shù)中對數(shù)組進(jìn)行處理(放大|過濾),把回調(diào)函數(shù)中的返回值收集組成一個新的數(shù)組
  • 實(shí)現(xiàn)思路
    • 初始化一個空的數(shù)組
    • 遍歷傳進(jìn)來的數(shù)組, 調(diào)用回調(diào)函數(shù)拿到遍歷數(shù)組的索引/value值, push到空數(shù)組中
    • return空數(shù)組

jQuery中remove()實(shí)現(xiàn)思路

  • 遍歷jQ實(shí)例對象
  • 每循環(huán)一次,就把當(dāng)前的標(biāo)簽刪掉

插件機(jī)制

  • 在jQuery框架的基礎(chǔ)上, 再提供一個新的js文件, 這個js中新增一些功能
  • js文件命名: jQuery-名稱.js
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末鲫凶,一起剝皮案震驚了整個濱河市胧瓜,隨后出現(xiàn)的幾起案子冀偶,更是在濱河造成了極大的恐慌愕把,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,884評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件募逞,死亡現(xiàn)場離奇詭異弓摘,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)腕够,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,755評論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來舌劳,“玉大人帚湘,你說我怎么就攤上這事∩醯” “怎么了大诸?”我有些...
    開封第一講書人閱讀 158,369評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長贯卦。 經(jīng)常有香客問我资柔,道長,這世上最難降的妖魔是什么撵割? 我笑而不...
    開封第一講書人閱讀 56,799評論 1 285
  • 正文 為了忘掉前任贿堰,我火速辦了婚禮,結(jié)果婚禮上啡彬,老公的妹妹穿的比我還像新娘羹与。我一直安慰自己,他們只是感情好庶灿,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,910評論 6 386
  • 文/花漫 我一把揭開白布纵搁。 她就那樣靜靜地躺著,像睡著了一般往踢。 火紅的嫁衣襯著肌膚如雪诡渴。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 50,096評論 1 291
  • 那天菲语,我揣著相機(jī)與錄音妄辩,去河邊找鬼。 笑死山上,一個胖子當(dāng)著我的面吹牛眼耀,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播佩憾,決...
    沈念sama閱讀 39,159評論 3 411
  • 文/蒼蘭香墨 我猛地睜開眼哮伟,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了妄帘?” 一聲冷哼從身側(cè)響起楞黄,我...
    開封第一講書人閱讀 37,917評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎抡驼,沒想到半個月后鬼廓,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,360評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡致盟,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,673評論 2 327
  • 正文 我和宋清朗相戀三年碎税,在試婚紗的時候發(fā)現(xiàn)自己被綠了尤慰。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,814評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡雷蹂,死狀恐怖伟端,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情匪煌,我是刑警寧澤责蝠,帶...
    沈念sama閱讀 34,509評論 4 334
  • 正文 年R本政府宣布,位于F島的核電站萎庭,受9級特大地震影響霜医,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜擎椰,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,156評論 3 317
  • 文/蒙蒙 一支子、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧达舒,春花似錦值朋、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,882評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至贯底,卻和暖如春丰辣,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背禽捆。 一陣腳步聲響...
    開封第一講書人閱讀 32,123評論 1 267
  • 我被黑心中介騙來泰國打工笙什, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人胚想。 一個月前我還...
    沈念sama閱讀 46,641評論 2 362
  • 正文 我出身青樓琐凭,卻偏偏與公主長得像,于是被迫代替她去往敵國和親浊服。 傳聞我的和親對象是個殘疾皇子统屈,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,728評論 2 351