精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

讀jQuery源碼之整體框架分析

開發 前端
讀一個開源框架,大家最想學到的就是設計的思想和實現的技巧。最近讀jQuery源碼,記下我對大師作品的理解和心得,跟大家分享,權當拋磚引玉。

讀一個開源框架,大家最想學到的就是設計的思想和實現的技巧。最近讀jQuery源碼,記下我對大師作品的理解和心得,跟大家分享,權當拋磚引玉。

先附上jQuery的代碼結構。

JS代碼

  1. (function(){  
  2.     //jQuery變量定義  
  3.     var jQuery  = function(){...};  
  4.     //jQuery原型定義(包含核心方法)                
  5.     jQuery.fn = jQuery.prototype = {...};  
  6.     //看上去很奇怪吧? 非常巧妙的設計,后面詳細介紹  
  7.     jQuery.fn.init.prototype = jQuery.fn;  
  8.     //提供jQuery靜態方法與對象方法的擴展函數  
  9.     jQuery.extend = jQuery.fn.extend = function(){...};   
  10.     //后面依次有多個對jQuery靜態方法的擴展  
  11.     jQuery.extend({...});  
  12.     //后面依次有多個對jQuery對象方法的擴展  
  13.     jQuery.fn.extend({...});  
  14.     jQuery.support = (function() {...})();  
  15.     //提供統一時間管理,jQuery內部使用,并不對外開放  
  16.     jQuery.event = {...};  
  17.     //Event類似于Java的POJO類.傳遞事件的對象  
  18.     jQuery.Event = function( src, props ) {...};   
  19.     //Sizzle選擇器,一個框架,可獨立使用。  
  20.     (function(){  
  21.         ...  
  22.         jQuery.find = Sizzle;  
  23.         ...  
  24.     })();  
  25.     ...  
  26.     //將定義的jQuery定義為全局變量  
  27.     window.jQuery = window.$ = jQuery;  
  28.     ...  
  29. })(); 

在結構上非常的清晰,定義一個jQuery對象,對jQuery對象進行擴展,賦給window,變成全局變量。就以下幾點做介紹:

1). 自執行的匿名函數。

2). $("...")形式調用返回 jQuery.fn.init對象。

3). 框架里最常見的 extend 函數。

一. 自執行匿名函數。

對javascript有一定基礎的都應該知道自執行匿名函數的好處。js是函數作用域。在函數里定義的變量都是局部變量,這樣就很好的避免了過多的全局變量(jQuery僅僅2個全局變量jQuery和$)。由于閉包屬性,雖然函數自執行結束了,但自執行函數里面定義的局部函數和變量還是能夠被定義成全局變量的jQuery和$所引用到,類似于Java的私有變量。好處可見一斑。

二. $("...")形式調用返回 jQuery.fn.init對象。

這是我剛看源碼的時候最不理解的地方。

Js代碼

  1. var jQuery = function( selector, context ) {  
  2.     // The jQuery object is actually just the init constructor 'enhanced'  
  3.     return new jQuery.fn.init( selector, context, rootjQuery );  
  4. }  
  5. 和  
  6. jQuery.fn.init.prototype = jQuery.fn; 

看懂這段我們先看看jQuery的使用。jQuery采用鏈式調用(如:$("#id").data("xxx")),這樣就知道$("#id")返回的是一個jQuery對象。但是調用的方式是函數調用。這個問題就成為了:以函數的方式調用返回jQuery對象,并且構造函數是init。現在就圍繞解決這個問題展開:

首先想到的是在函數式調用的時候返回一個jQuery對象。

  1. var jQuery = function( selector, context ) {  
  2.     return new jQuery( selector, context);  

兄弟,你確定這樣? 明眼人一看就知道嚴重的問題所在,死遞歸!

既然不能調用本身,那我們想到另一種辦法:再定義一個函數A,A的原型與jQuery的原型一樣,那A的對象與jQuery生成的對象就是一模一樣了(javascript是原型繼承),而且將A的constructor定義為jQuery,上面的問題不是迎刃而解么?

JS代碼

  1. var jQuery = function( selector, context ) {  
  2.     return new A( selector, context);  
  3. }  
  4.  
  5. var A = function(){  
  6.     if(this.init) {  
  7.         this.init();  
  8.     }  
  9. };  
  10. A.prototype = jQuery.prototype; 

這樣就解決了上面的問題,因為jQuery和A擁有同一個原型,所以生成的對象都擁有相同的方法。但是還是感覺A定義的有些多余,是不是?

既然定義A就為了返回A的對象,那init函數也能生成對象(以為js中沒有類,定義的函數可以當函數執行,也能new成對象)。既然用init的話,那樣init函數會自動執行,也不用再調用,豈不是更方便!所以就看到了我們之前看到的代碼。

這里可能還有個fn解釋下,其實這個fn沒有什么特殊意思,只是jQuery.prototype的引用,jQuery支持自己擴展屬性,這個對外提供了一個接口,jQuery.fn.extend()來對對象增加方法,比使用jQuery.prototype.extend()更好。封裝想,字面就能看懂是對函數擴展,而不是看上去直接修改prototype.友好的用戶接口。

相對于文字,圖形化更加直觀,對上面的引用來引用去畫了個圖,更好的理解:

其實在使用返回 new jQuery.fn.init( selector, context, rootjQuery ) 對象方式,我還有另一種實現:

  1. var jQuery = function( selector, context ) {  
  2.     //如果以$("#id") 方式調用this就不是jQuery.這樣返回jQuery對象  
  3.     if(!(this instanceof jQuery)) {  
  4.         return new jQuery(selector, context);  
  5.     }  
  6.     if(this.init) {  
  7.         this.init();  
  8.     }  
  9. }  
  10. //這行就可以注釋了  
  11. //jQuery.fn.init.prototype = jQuery.fn; 

這種經過測試時可以的,不知道還有沒有其他的隱蔽問題,暫時沒發現,也算是一種實現吧。供大家參考。

三. 框架里最看到的 extend 函數

在后面的段落中有大段大段的 jQuery.extend({...}) 和 jQuery.fn.extend({...}) 代碼。這里先解釋下這個的作用和不同。

extend 在java中是繼承,在我之前寫的一篇 <簡單實現Javascrip繼承> 文章不同,也都是用了extend關鍵字。那些我們都說叫繼承,而這里我更加喜歡叫擴展。為什么呢? 繼承是產生了新的類,而這里沒有,這里的2個函數***個是擴展jQuery的靜態方法,而第二個是用戶自己擴展對象的方法。靜態方法?對象方法?這里我來做個解釋,在jQuery中有2中調用形式:

1)$.Ajax(...);

2)$("#id").data("xxx");

***種調用我稱為靜態調用,就類似于Java的靜態方法一樣,不用生成對象,而是類級函數。這里的$就相當于命名空間一樣。我們知道在以往js的編程中,如果有命名空間我們都這樣:

  1. var ns = {};  
  2. ns.Ajax = function(){...}; 

那為什么這里不是對象,而是函數做一個命名空間呢? 其實在js中一切都是對象!包括函數也是對象(說Java一切都是對象,我覺得其實這句話形容js更加貼切)。

第二種調用我成為對象調用,因為.data()方法是定義在原型中的,只有new個對象才能調用的,所以成為對象方法。

我們看代碼jQuery.extend = jQuery.fn.extend = function(){...}; 這個是連等,也就是2個指向同一個函數,怎么會實現不同的功能呢?這就是this 的功能了。jQuery.extend 調用的時候,this是指向jQuery對象的(jQuery是函數,也是對象!),所以這里擴展在jQuery上。 而jQuery.fn.extend 調用的時候,this指向fn對象,而上圖中科院看到,jQuery.fn 和jQuery.prototype指向同一對象,擴展fn就是擴展jQuery.prototype原型對象。這里增加的是原型方法,也就是對象方法了。所以jQuery的api中提供了以上2中擴展函數。

原文鏈接:http://www.iteye.com/topic/1126505

【編輯推薦】

  1. 淺談管理系統操作日志設計(附操作日志類)
  2. Winform開發框架之系統登錄實現
  3. JavaScript項目優化總結
  4. 項目模塊開發——切dvd庫
  5. 如何掌握程序語言
責任編輯:張偉 來源: lcyangily的博客
相關推薦

2016-11-25 13:14:50

Flume架構源碼

2022-07-19 20:04:31

NAPI模塊鴻蒙

2012-11-06 11:07:59

jQueryJSjQuery框架

2017-07-17 11:52:54

jQuery源碼分析前端框架類庫

2011-05-26 10:05:48

MongoDB

2021-07-06 09:29:38

Cobar源碼AST

2024-06-13 07:55:19

2021-03-23 09:17:58

SpringMVCHttpServletJavaEE

2013-09-16 10:40:44

Sizzle

2023-02-26 08:42:10

源碼demouseEffect

2012-09-20 10:07:29

Nginx源碼分析Web服務器

2011-05-26 16:18:51

Mongodb

2016-03-23 11:05:58

Socket開發框架分析

2019-02-21 23:36:09

源碼框架讀源碼

2020-07-28 08:54:39

內核通信Netlink

2015-09-11 09:17:55

JavaJava HashMa

2021-09-16 15:08:08

鴻蒙HarmonyOS應用

2022-01-06 07:06:52

KubernetesResourceAPI

2017-01-12 14:52:03

JVMFinalRefere源碼

2022-08-27 08:02:09

SQL函數語法
點贊
收藏

51CTO技術棧公眾號

一级特黄免费视频| 欧美精品久久久久久久久老牛影院| 亚洲高清久久久久久| 日韩av电影免费在线观看| 欧美激情精品久久| 国语自产精品视频在线看抢先版结局 | 亚洲日本电影在线| 91sa在线看| 午夜视频在线免费看| 免费av毛片在线看| 国产 欧美 精品| 要久久爱电视剧全集完整观看| 亚洲欧美另类小说| 91久久在线播放| 99自拍偷拍视频| 久久r热视频| www.欧美日韩国产在线| 久久久久久久一| 国产香蕉精品视频| 污污网站在线看| 精品亚洲aⅴ乱码一区二区三区| 亚洲图片在区色| 国产极品美女高潮无套久久久| 五月婷婷六月丁香综合| 国产日韩亚洲欧美精品| 日韩成人在线电影网| 青青草精品视频在线| 手机在线观看免费av| 亚洲每日在线| 日韩精品在线影院| 精品99在线视频| 国内av一区二区三区| 三级成人在线视频| 在线免费观看羞羞视频一区二区| 激情网站五月天| 婷婷色在线播放| 国产精品理伦片| 亚洲一区二区在线| 国产在线观看成人| 婷婷成人综合| 在线一区二区视频| 亚洲国产精品一区在线观看不卡| 夜夜躁狠狠躁日日躁av| 欧美日韩成人| 亚洲男子天堂网| 亚洲精品视频导航| 91最新在线视频| 成人动漫av在线| 日韩av手机在线看| 国产91在线播放九色| 秋霞一区二区| 欧美日韩美女在线观看| 亚洲精品中文字幕在线| 全色精品综合影院| 久久国产生活片100| 精品视频9999| 欧美bbbbb性bbbbb视频| 久久久久久久性潮| 欧美亚洲综合另类| 97久久国产亚洲精品超碰热| 手机看片一区二区三区| 99视频有精品| 久久精品国产美女| 国产精品久久久久久69| 亚洲黄色免费| 91精品国产一区| 午夜毛片在线观看| 亚洲成人av| 亚洲精品国产品国语在线| 999精彩视频| 成人免费观看在线观看| 国产精品视频yy9299一区| 日韩一区国产在线观看| 欧美精品电影| 尤物av一区二区| 免费日韩电影在线观看| 国产日韩欧美中文字幕| 亚洲欧美日韩国产综合精品二区| 久久精品国产综合| 亚洲一区二区三区蜜桃| 精品一区视频| 欧美三级视频在线观看| 国产原创popny丨九色| 日本电影全部在线观看网站视频| 最好看的中文字幕久久| 免费成人深夜夜行视频| 国产永久免费高清在线观看视频| 国产女人水真多18毛片18精品视频 | 婷婷在线精品视频| 精品在线观看入口| 亚洲精品一区二区三区精华液| 久久久久久久久久一区二区| 在线最新版中文在线| 国产偷人妻精品一区| 国产一区二区欧美| 日韩高清av一区二区三区| 波多野结衣一本| 青青草这里只有精品| 日韩欧美国产三级| 欧美性猛交xxxx乱大交91| 亚洲成人激情社区| 欧美日韩美女在线观看| 日本中文字幕高清| 电影一区二区在线观看| 日韩亚洲欧美高清| 91亚洲一区二区| 婷婷久久免费视频| 欧美日韩成人一区| 在线观看免费不卡av| 国产一区二区三区亚洲| 中文字幕在线亚洲| 99热在线观看精品| 首页国产精品| 久久精品国产欧美亚洲人人爽| 日产欧产va高清| 91久久在线| 国产日韩在线观看av| 亚洲图片小说视频| 99久久精品国产观看| 国产九区一区在线| 涩涩视频在线观看免费| 亚洲女爱视频在线| 777视频在线| 九色精品蝌蚪| 国产亚洲精品成人av久久ww| 日本少妇在线观看| 国产资源在线一区| 国产成人精品福利一区二区三区 | 精品亚洲国产成人av制服丝袜| 久久国产精品一区二区三区| 污污的视频在线观看| 欧美色手机在线观看| 无码h肉动漫在线观看| 很黄很黄激情成人| 欧美国产视频一区二区| 久久久国产精华液| 国产日韩精品视频一区二区三区 | 99久久久久成人国产免费| 国产欧美久久久精品影院| 久久精品免费一区二区| 四虎成人在线| 91精品国产乱码| 催眠调教后宫乱淫校园| 伊人久久大香线蕉综合网蜜芽| 欧美激情啊啊啊| 国产高清在线免费| a美女胸又www黄视频久久| 欧美a级免费视频| 久久综合给合| 欧美乱大交xxxxx另类电影| 一级二级三级视频| 国产精品国产三级国产有无不卡 | 欧美办公室脚交xxxx| 欧美性猛交xxxx富婆| 鲁一鲁一鲁一鲁一av| 国产一区网站| 国产精品成人国产乱一区| av手机免费看| 一区二区三区日本| 性一交一黄一片| 狠狠爱综合网| 九色91视频| 成人性生活视频| 伊人久久久久久久久久| 中文字幕日产av| 99精品一区二区| 成人免费观看视频在线观看| 国产探花一区| 中文字幕av免费专区久久| 欧美一卡二卡三卡四卡| 成年人视频软件| 极品少妇一区二区三区精品视频| 亚洲自拍的二区三区| 黑人另类精品××××性爽| 在线视频国内自拍亚洲视频| 永久免费av无码网站性色av| 亚洲高清av| 成人在线视频网站| 天堂av网在线| 亚洲一区影音先锋| 高清一区在线观看| 午夜久久免费观看| 高清国产在线一区| 三级成人黄色影院| 亚洲国产天堂网精品网站| av大全在线观看| 成人午夜av电影| 国产手机视频在线观看| 日韩一区精品| 久久久91精品| 五月婷婷久久久| 欧美日韩成人一区二区| 99免费在线观看| 欧美激情综合在线| 自拍偷拍激情视频| 日本人妖一区二区| 欧美日韩国产精品一卡| 96av在线| 亚洲成人网在线观看| 精品黑人一区二区三区| 久久久亚洲午夜电影| 男人日女人逼逼| 久久porn| 78色国产精品| 日本高清视频在线播放| 欧美日韩精品三区| 中文字幕第28页| 国产精品视频免费看| 91丝袜在线观看| 亚洲专区免费| 成人午夜免费剧场| 日韩成人精品| 国产精品h片在线播放| 蜜桃成人在线视频| 91国偷自产一区二区三区成为亚洲经典 | 成人性生活视频| 欧美第一页在线| 午夜视频成人| 亚洲人高潮女人毛茸茸| yjizz国产| 亚洲久草在线视频| 国产精品成人在线视频| 免费看黄色91| 中文字幕精品—区二区日日骚| 欧美成人家庭影院| 欧美最近摘花xxxx摘花| 青青草视频在线免费观看| 欧美一区二区黄| 一区二区三区黄| 一区二区三区四区在线免费观看| 成人小视频免费看| 久久久久久夜精品精品免费| 美女搡bbb又爽又猛又黄www| 国产一区二区三区免费看| 色婷婷成人在线| 蜜桃在线一区二区三区| 福利在线一区二区三区| 久久狠狠婷婷| 亚洲日本无吗高清不卡| 九九在线高清精品视频| 老司机精品福利在线观看| 久草在线综合| 就去色蜜桃综合| 免费不卡中文字幕在线| 麻豆传媒一区二区| 一本色道久久综合亚洲精品酒店| 久久国产精品亚洲va麻豆| 青青草原在线亚洲| 久久国产精品一区二区三区| 牲欧美videos精品| 牛人盗摄一区二区三区视频| 亚洲涩涩av| 视频一区二区综合| 香蕉免费一区二区三区在线观看| 成人淫片在线看| 99久久999| 91精品国产成人| 日本在线影院| 日本精品久久久| 高清成人在线| 国产精品夜色7777狼人| av中文在线资源库| 国产69精品久久久久久| 大地资源网3页在线观看| 亚洲国产精品悠悠久久琪琪 | 国产a级毛片一区| 免费日韩中文字幕| 日韩电影在线免费| 中文字幕久久av| 国产东北露脸精品视频| 91色国产在线| 久久91精品国产91久久小草| av黄色在线网站| 久久久精品性| 激情五月俺来也| 国产精一区二区三区| 不卡av免费在线| 久久99久久99精品免视看婷婷| 天天操精品视频| 99免费精品在线| www.黄色在线| 一区二区三区四区不卡在线| 9i看片成人免费看片| 欧美日韩不卡一区二区| 亚洲黄色小说网| 91麻豆精品国产91久久久久久久久| 天天干在线播放| 欧美日韩三级一区二区| av在线亚洲天堂| 日韩激情在线视频| 在线国产91| 最近免费中文字幕视频2019| 狠狠狠综合7777久夜色撩人| y97精品国产97久久久久久| 国产51人人成人人人人爽色哟哟 | 国产色婷婷国产综合在线理论片a| 亚洲专区**| 97视频热人人精品| 国产精品视频一区二区三区综合| 国产精品自产拍高潮在线观看| 亚洲成人偷拍| 日韩欧美视频一区二区| 国产精品hd| www.cao超碰| 国产亚洲人成网站| 受虐m奴xxx在线观看| 亚洲男同性视频| 亚洲 欧美 日韩 在线| 日韩欧美一区二区免费| h视频网站在线观看| 中文字幕精品久久| 欧美aaa免费| 性色av一区二区三区免费| 国产拍在线视频| 国产精品亚洲美女av网站| 欧美日韩一本| 国产系列第一页| 亚洲成av人片乱码色午夜| 日本黄网站免费| www.亚洲免费av| 欧美日韩精品在线观看视频 | 99久久久无码国产精品性色戒| 国产农村妇女精品一区二区| 91成人在线观看喷潮蘑菇| 高清日韩电视剧大全免费| 国产精品一区二区亚洲| 91福利资源站| 暖暖视频在线免费观看| 8x拔播拔播x8国产精品| 伊色综合久久之综合久久| 超碰97免费观看| 美国十次了思思久久精品导航| 精品无人区无码乱码毛片国产| 欧美国产激情二区三区| www.国产com| 亚洲精品国产成人| av日韩中文| 久久久精品动漫| 国产欧美日韩一级| 亚洲欧美日韩色| 亚洲宅男天堂在线观看无病毒| www..com国产| 欧美午夜精品久久久久久超碰| 亚洲色图狠狠干| 777午夜精品福利在线观看| 日本妇女一区| 欧美 日韩精品| 国产日韩高清在线| 做爰无遮挡三级| 欧美精品一区二区三区蜜臀| 污视频在线看网站| 高清视频一区| 日韩视频免费| www.com污| 26uuu欧美日本| 欧美在线视频第一页| 91精品在线一区二区| 亚洲丝袜一区| 国产精品xxxx| 亚洲欧美卡通另类91av| 91国模少妇一区二区三区| 欧美日韩在线播| 黄网站在线播放| 日本精品在线视频| 欧美色婷婷久久99精品红桃| 日本黄色片一级片| 美女视频黄 久久| 色偷偷www8888| 欧美mv和日韩mv国产网站| 在线免费av网站| 91视频在线免费观看| 国产亚洲一区在线| 国产欧美小视频| 日韩欧美精品在线| 在线天堂新版最新版在线8| 一本一道久久a久久精品综合| 国产精品影视在线| 久久免费激情视频| 最近2019中文字幕在线高清| 超碰97久久国产精品牛牛| 国产精品夜夜夜爽张柏芝| 国产91露脸合集magnet| 国产精品视频123| 日韩亚洲精品电影| 97品白浆高清久久久久久| 99精品免费在线观看| 亚洲视频你懂的| 亚洲欧美丝袜中文综合| 国产日韩中文字幕| 99视频精品| 日日噜噜夜夜狠狠久久波多野| 欧美色倩网站大全免费| 色噜噜狠狠狠综合欧洲色8| 免费成人看片网址| 国产精品一区二区在线看| 欧产日产国产69| 国产视频久久久久久久| a一区二区三区亚洲| 浮妇高潮喷白浆视频| 亚洲丝袜美腿综合|