精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

91香蕉国产线在线观看| 欧美精品人人做人人爱视频| 免费在线视频观看| 蜜臀av一区| 欧美亚洲愉拍一区二区| 大地资源网在线观看免费官网| 男人的午夜天堂| 粉嫩久久久久久久极品| 在线观看网站黄不卡| 亚洲7777| 天堂在线免费av| 精品一区二区三区在线播放| 97国产一区二区精品久久呦 | 日韩欧美在线123| 99在线精品免费视频| 一本一道波多野毛片中文在线 | 亚洲精品视频三区| free性护士videos欧美| 中文字幕在线视频一区| 国产欧美一区二区三区不卡高清| 精品无码人妻一区二区三| 国产亚洲欧美日韩在线观看一区二区| 午夜久久久影院| 一区二区三区四区影院| 久久久久久青草| 免费一级片在线观看| 国产男女无套免费网站| aa亚洲婷婷| 欧美成人精品h版在线观看| 一级性生活毛片| www.成人在线视频| 欧美午夜宅男影院在线观看| 免费的一级黄色片| 好操啊在线观看免费视频| 久久久久99精品国产片| 国产日韩欧美精品| 国产丰满美女做爰| 久久成人免费网| 国产精品欧美激情在线播放| 日本一区二区三区精品| 亚洲激情黄色| 欧美精品国产精品日韩精品| 性生交大片免费全黄| 精品国产一区二区三区小蝌蚪| 午夜精品国产更新| 777久久精品一区二区三区无码 | 国产精品久久久久久久久久久久午夜片 | 一级全黄裸体免费视频| 欧美亚洲自偷自偷| 69久久夜色精品国产69乱青草| 在线免费观看黄色小视频| 超碰97成人| 日韩精品一区在线观看| 99精品视频免费版的特色功能| 美女精品导航| 一区二区三区免费网站| 久久天天东北熟女毛茸茸| 黄色片网站在线观看| 日韩毛片一二三区| 艳母动漫在线观看| 麻豆av在线免费观看| 亚洲一区二区三区在线| 丁香六月激情网| 黄色羞羞视频在线观看| 亚洲.国产.中文慕字在线| 国产精品国产亚洲精品看不卡| 一级毛片视频在线| 国产精品亲子乱子伦xxxx裸| 在线视频不卡一区二区| 成人日日夜夜| 亚洲高清久久久| 97成人在线观看视频| 欧美三区四区| 69堂成人精品免费视频| www.四虎精品| 一区二区三区视频免费观看| 中文字幕久精品免费视频| 中国毛片直接看| 亚洲国产欧美国产综合一区| 热re91久久精品国99热蜜臀| 中文字幕+乱码+中文| 国产在线不卡视频| 国产一级特黄a大片99| 青青草免费在线| 国产精品成人免费在线| 亚洲色成人www永久在线观看| 精产国品自在线www| 亚洲综合免费观看高清完整版| 亚洲国产精品www| 中文字幕中文字幕在线中高清免费版| 国产日产亚洲精品系列| 日本xxx免费| 欧美男男tv网站在线播放| 欧美综合一区二区| 波多野结衣中文字幕在线播放| 久久国内精品| 亚洲成人黄色在线观看| 国产成人一区二区在线观看| 欧美日韩亚洲一区二区三区在线| 久久精品成人欧美大片古装| 国产精品第一页在线观看| 久久高清免费观看| 999热视频在线观看| 国产黄在线看| 亚洲国产精品久久久久婷婷884 | 日韩三级在线观看| 一区二区三区免费在线观看视频| 黄色成人美女网站| 色偷偷9999www| 久久亚洲精品国产| 国产精品一区二区x88av| 久久av免费一区| av黄在线观看| 欧洲精品视频在线观看| 久久人妻少妇嫩草av无码专区| 欧美国产不卡| 欧美成人精品影院| 在线观看中文字幕2021| 99精品欧美一区二区蜜桃免费 | 五月天中文字幕在线| 欧美电影免费网站| 欧美激情一级二级| 亚洲图片视频小说| 久久久久久电影| 国产免费内射又粗又爽密桃视频| a级片在线免费| 欧美日韩综合色| 欧美多人猛交狂配| 宅男噜噜噜66国产日韩在线观看| 国产精品成人v| 午夜小视频免费| 亚洲一区二区中文在线| aaa一级黄色片| 欧美第一精品| 国产精品色午夜在线观看| 男人的天堂在线视频| 天天色综合成人网| 亚洲av网址在线| 亚洲人成久久| 国产一区二区三区四区五区在线 | 亚洲国产精品国自产拍久久| 国产精品理伦片| 欧美婷婷精品激情| 第一sis亚洲原创| 国产精品99蜜臀久久不卡二区| 国产一区二区自拍视频| 国产欧美1区2区3区| 欧美性猛交久久久乱大交小说 | 美女视频黄a大片欧美| 欧美中文娱乐网| 中文在线资源| 亚洲欧美日韩中文在线制服| 国产suv精品一区二区33| 久久综合久久综合久久| www.亚洲天堂网| 国产精品片aa在线观看| 国产精品久久激情| 亚洲s色大片| 欧美一级夜夜爽| 国产在线综合网| 91在线国产观看| 国产精品少妇在线视频| 精品国产一区二区三区四区| 国产在线拍偷自揄拍精品| 国产在线高清理伦片a| 日韩欧美国产小视频| 国产午夜福利精品| 久久亚洲私人国产精品va媚药| 免费的一级黄色片| 精品三级av在线导航| 欧美性受xxxx白人性爽| 国产精品麻豆一区二区三区| 666欧美在线视频| 久久精品www| 久久综合色8888| 中文字幕免费高清在线| 悠悠资源网久久精品| 另类欧美小说| 9999精品视频| 久久久免费精品视频| 邻居大乳一区二区三区| 337p亚洲精品色噜噜狠狠| 日韩av一二三区| 国产女人水真多18毛片18精品视频| 日韩av综合在线观看| 欧美精品尤物在线观看| 91网免费观看| 伊人久久国产| 日韩三级成人av网| 欧美在线 | 亚洲| 欧美日韩综合色| 日本一级一片免费视频| 国产精品久99| 800av在线播放| 韩国三级在线一区| 精品中文字幕av| 自拍欧美日韩| 麻豆av福利av久久av| 精品国产亚洲日本| 国产精品88a∨| 暧暧视频在线免费观看| 丝袜亚洲另类欧美重口| 性xxxx搡xxxxx搡欧美| 欧美高清性hdvideosex| 久久久久久不卡| 一区二区久久久久久| 国产精品成人在线视频| 91影院在线观看| 免费观看一区二区三区| 日本成人中文字幕在线视频| 国产不卡一区二区视频| 亚洲一区二区| 亚洲午夜精品一区二区| 亚洲女娇小黑人粗硬| 波多野结衣精品久久| 亚洲精品自拍| 国产精品91一区| 免费观看欧美大片| 国内外成人免费激情在线视频| 亚洲av成人无码网天堂| 91精品国产91综合久久蜜臀| 亚洲精品无码久久久久| 亚洲动漫第一页| 曰本女人与公拘交酡| 国产精品久久网站| 久久亚洲无码视频| 久久亚洲私人国产精品va媚药| 天天综合网日韩| 另类图片国产| 中文字幕日本最新乱码视频| 在线成人黄色| 男女啪啪免费视频网站| 91久久亚洲| 国产激情片在线观看| 91精品国产乱码久久久久久| 亚洲日本无吗高清不卡| 日韩理论在线| 一区二区三区在线视频111| 日韩精品欧美| 亚洲欧洲日韩综合二区| 青青草成人影院| 水蜜桃亚洲一二三四在线| 欧美女优在线视频| 欧美在线播放一区| 欧美精美视频| 神马一区二区影院| 日韩在线观看| 欧美三级午夜理伦三级老人| 小处雏高清一区二区三区| 国产又黄又爽免费视频| 色资源在线观看| 91精品国产乱码久久久久久久| 国产精品扒开腿做爽爽爽的视频| 亚洲成人影院麻豆| 久久精品国产99国产精品澳门 | 91av在线免费视频| 亚洲成人av电影在线| 九九九国产视频| 五月综合激情网| 免费看毛片网站| 欧美色精品在线视频| 成人黄色免费网| 8v天堂国产在线一区二区| 91中文字幕在线播放| 91精品国产色综合久久不卡电影 | 日本女人一区二区三区| 久久久久久久久久久免费视频| 重囗味另类老妇506070| 国产美女永久无遮挡| 国产精品久久久久9999高清| 一区二区三区入口| 国产精品一区免费视频| 国产精品嫩草av| 国产亚洲欧美中文| 婷婷激情四射网| 亚洲大尺度视频在线观看| av资源免费观看| 欧美日韩一区视频| 国产极品久久久| 日韩精品中文字幕在线| 在线视频二区| 欧美激情在线一区| 666av成人影院在线观看| 92福利视频午夜1000合集在线观看| 97久久香蕉国产线看观看| 成人春色激情网| 日韩视频一二区| 欧美一卡2卡3卡4卡无卡免费观看水多多| 成人福利一区| 日本在线高清视频一区| 一区二区三区四区在线观看国产日韩| 午夜午夜精品一区二区三区文| 日韩在线影视| 一区二区三视频| 日韩一区二区免费看| 在线免费av播放| 成人性生交大片免费看中文| 微拍福利一区二区| 亚洲午夜在线视频| 欧美日韩 一区二区三区| 日韩欧美视频在线| 成人高清免费在线播放| 91精品国产91久久| 激情综合婷婷| 视频三区二区一区| 亚洲毛片播放| 国内精品国产三级国产aⅴ久| 国产美女精品在线| 人妻丰满熟妇aⅴ无码| 亚洲乱码中文字幕| 综合久久中文字幕| 亚洲精品网站在线播放gif| 狂野欧美性猛交xxxxx视频| 国产一区二区在线免费| 亚洲aaa级| 人妻久久久一区二区三区| 国产麻豆精品视频| 美女100%露胸无遮挡| 午夜精品久久久久久久99樱桃| 黄色大片网站在线观看| 日韩免费在线观看| 永久免费在线观看视频| 国产精品∨欧美精品v日韩精品| 日韩美女在线| 日韩电影大全在线观看| 在线看片成人| aaa黄色大片| 亚洲欧美日韩国产手机在线 | 日本韩国一区二区| 日韩有码第一页| 欧美激情精品久久久久久久变态| bl在线肉h视频大尺度| 999国内精品视频在线| 91亚洲国产| 亚洲这里只有精品| 国产欧美视频在线观看| 伊人久久中文字幕| 国产一区二区三区久久精品 | 亚洲无在线观看| 久久亚洲春色中文字幕久久久| 黑人操日本美女| 欧美精品vⅰdeose4hd| 欧美边添边摸边做边爱免费| 国产拍精品一二三| 婷婷成人基地| 熟妇女人妻丰满少妇中文字幕| 不卡视频一二三四| 亚洲精品午夜久久久久久久| 亚洲精品一区二区三区在线观看| 国产在线观看高清视频| 日韩av片免费在线观看| 精品国产乱码久久久| 美女一区二区三区视频| 国产精品亲子伦对白| 国产麻豆一精品一男同| 久久av在线播放| 91综合久久爱com| 国产97在线 | 亚洲| 久久免费视频色| 中国精品一区二区| 久久国内精品一国内精品| 99综合久久| 欧美又粗又长又爽做受| 成人精品一区二区三区中文字幕| 顶级黑人搡bbw搡bbbb搡| 6080yy午夜一二三区久久| 青青青草视频在线| 久久精品日韩精品| 免费在线观看视频一区| 日本不卡一二区| 亚洲精品在线三区| 天天综合网站| 国产又粗又大又爽的视频| 波多野结衣视频一区| 一级片免费在线播放| 久久国产精品色| 亚洲AV无码成人精品一区| 精品一区二区国语对白| 欧美色图亚洲视频| 亚洲精品av在线播放| 午夜av成人| 欧美做受777cos| 91免费看`日韩一区二区| 国产一区二区在线视频观看| 久久久亚洲福利精品午夜| 男男gay无套免费视频欧美| 99日在线视频| 欧美日韩国产综合新一区 | 性欧美精品一区二区三区在线播放| 亚洲国产免费看| 免费一级suv好看的国产网站| 一本大道久久a久久综合| 日本中文字幕在线播放| http;//www.99re视频| 亚洲欧美日韩专区| 国产精品三区在线观看| 国产一区二区三区18| 果冻天美麻豆一区二区国产| 亚洲色图久久久| 亚洲电影一区二区三区|