jQuery基本結(jié)構(gòu)分析
- 結(jié)構(gòu): 閉包(即時函數(shù))-函數(shù)持有了本不屬于自己的變量
- 普通函數(shù)也是閉包理解
- 函數(shù)的訪問規(guī)則-內(nèi)層可以訪問外層的作用域
- 普通函數(shù)也是閉包理解
- 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)
- 本身是對象并非數(shù)組
- key從0開始, 依次遞增-可以允許存在另類的key(但是在處理時會被忽略)
- 擁有l(wèi)ength屬性, 記錄key的值
- 必需擁有l(wèi)ength-1屬性(length-1對鍵值對)
- 該對象不是window(
window.length
記錄的iframe標(biāo)簽的個數(shù))- 判斷某個對象是否是window:
obj==window.window
- 判斷某個對象是否是window:
- 偽數(shù)組種類-處理入口函數(shù)為偽數(shù)組的方法
- 系統(tǒng)自帶的偽數(shù)組
- 使用
[].push.apply(obj,系統(tǒng)自帶的偽數(shù)組)
- 使用
- 自定義的偽數(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ù)組在IE9以下(IE9-)會報錯, 不能直接用
- 系統(tǒng)自帶的偽數(shù)組
入口函數(shù)參數(shù)分析
-
參數(shù)判斷為假的情況
- 返回空的jQuery實(shí)例對象
-
參數(shù)是字符串(選擇器)
- 根據(jù)選擇器獲取頁面中所有指定的標(biāo)簽,并且保存到實(shí)例對象中返回
-
參數(shù)是字符串(標(biāo)簽)
- 把參數(shù)中所有的一級標(biāo)簽保存到實(shí)例對象中返回,key從0開始一次遞增,這些標(biāo)簽作為key對應(yīng)的value值保存的
-
參數(shù)是數(shù)組
- 把數(shù)組中所有元素依次取出, 保存為jQ實(shí)例對象的鍵值對返回(key從0開始遞增, 數(shù)組中的元素作為對應(yīng)的value值)
-
參數(shù)是偽數(shù)組(結(jié)構(gòu)類似于數(shù)組)
- 把偽數(shù)組中所有的value值依次取出, 保存jQ實(shí)例對象的鍵值對返回(key從0開始遞增, value作為對應(yīng)key的value值)
-
參數(shù)是對象
- 會把參數(shù)(對象)作為整體保存為key為0對應(yīng)的value值, 返回jQ實(shí)例對象
-
參數(shù)是DOM標(biāo)簽(對象)
- 會把參數(shù)(DOM對象)作為整體保存為key為0對應(yīng)的value值, 返回jQ實(shí)例對象
-
參數(shù)是非零數(shù)字
- 會把參數(shù)(數(shù)字)作為整體保存在key為0對應(yīng)的value值, 返回jQ實(shí)例對象
布爾類型的值: 同8.
-
函數(shù)==監(jiān)聽頁面的加載DOM
-
document.addEventListener(要監(jiān)聽的事件, 事件發(fā)生后的回調(diào)函數(shù))
- 不兼容IE9-, 會報錯
- 參數(shù)一:
DOMContentLoaded
表示DOM加載完畢
- 使用
document.attachEvent()
兼容IE9以下瀏覽器- 參數(shù)
- 要監(jiān)聽的狀態(tài)(固定: onreadystatechange)
- 事件發(fā)生后的回調(diào)函數(shù)
- 參數(shù)
-
入口函數(shù)參數(shù)分析-總結(jié)
- 條件判斷為假: 返回空的jQ實(shí)例對象
- 字符串(選擇器 | 標(biāo)簽)
- 數(shù)組或者偽數(shù)組:
- 對象 | DOM節(jié)點(diǎn) | true | 數(shù)字(非0): 會把傳入的參數(shù)保存為key為0對應(yīng)的value值, 返回
- 函數(shù)(待處理)
- 思考init方法內(nèi)部的實(shí)現(xiàn)邏輯
- 對參數(shù)進(jìn)行類型判斷, 根據(jù)判斷類型的結(jié)果分別處理
工具方法的抽取
- 方法
工具對象: 多個方法放在一個對象中
-
給構(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]; }
給構(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ù)
- 沒有參數(shù)(判斷
each()實(shí)現(xiàn)思路
-
each方法的使用
jQ.each(obj | arr,fn(key,value){.....})
-
jQ().each(fn(key,value){.....})
- 作用: 遍歷對象 | 數(shù)組 | 偽數(shù)組, 每循環(huán)一次就把當(dāng)前的鍵值對(索引/元素)作為參數(shù)傳遞給后面的回調(diào)函數(shù), 并且執(zhí)行回調(diào)函數(shù)中的代碼
-
jQuery中each()的實(shí)現(xiàn)思路
- 遍歷對象 | 數(shù)組 | 偽數(shù)組
- [1] 遍歷對象 ==> for..in
- [2] 遍歷數(shù)組 ==> for | for..in (不推薦:包括原型成員) ? |forEach
- 遍歷偽數(shù)組 ==> for..in | for
- 調(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值)
- 遍歷對象 | 數(shù)組 | 偽數(shù)組
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