亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

ExtJS與jQuery的一點細節上的對比

2019-11-17 01:36:37
字體:
來源:轉載
供稿:網友

ExtJS與jQuery的一點細節上的對比

首先說明這不是一篇完整解讀ExtJS和jQuery所有方面差異的文章,只是針對我個人剛看了兩天的jQuery產生的一些疑問的整理。之前用過一段時間ExtJS,了解ExtJS的一些機制。現在做移動開發,又選定了jquery mobile,要寫控件,所以需要了解jquery。(不過換工作之后應該不會再用jQuery了,坑估計是短期內填不上了)

1、jQuery是個什么東西?Ext是什么東西?(此處不是指兩個框架,而是指我們在寫程序的時候,經常用到的兩個關鍵字--暫時稱之為關鍵字)

之前用的是ExtJS,Ext是個Object,通過字面量創建的,Ext.js文件里,3.3.1版:

Js代碼
  1. Ext={
  2. version:'3.3.1',
  3. versionDetail:{
  4. major:3,
  5. minor:3,
  6. patch:1
  7. }
  8. };

4.0版本,此處global == window:

Js代碼
  1. if(typeofExt==='undefined'){
  2. global.Ext={};
  3. }

既然Ext是個Object,那jQuery是不是也是個Object呢?NO,來分析下源碼,jquery.js:

Js代碼
  1. varjQuery=(function(){
  2. //DefinealocalcopyofjQuery
  3. varjQuery=function(selector,context){
  4. //ThejQueryobjectisactuallyjusttheinitconstructor'enhanced'
  5. returnnewjQuery.fn.init(selector,context,rootjQuery);
  6. },
  7. ...//此處省略900行
  8. returnjQuery;
  9. })();

此處大概明白了,jQuery是個Function,并且由于此處調用jQuery的時候,有個return,所以var v = jQuery(xxx)和var v = new jQuery(xxx)調用后,v都是同一個函數的實例。在《javaScript高級程序設計》第18章第一節有提到過這種技巧,叫做作用域安全的構造函數,不過書上提到的形式稍有差異:

Js代碼
  1. functionPerson(name,age){
  2. if(thisinstanceofPerson){
  3. this.name=name;
  4. this.age=age;
  5. }else{
  6. returnnewPerson(name,age);
  7. }
  8. }

這樣var p = Person('a',21)和var p = new Person('a',21) ,p就都是Person實例了,如果去掉if判斷和else后邊的內容,第一種調用p是undefined。

在jquery.js最后,把變量jQuery賦值給了$,后續可以通過$這種簡寫使用jQuery,算是一個簡寫的別名吧:

Js代碼
  1. window.jQuery=window.$=jQuery;

此處先挖個坑,構造函數中(如此處的Person)的this到底怎么理解?

2、jQuery和Ext在這兩個關鍵字都怎么使用的,有何異同?

2.1、Ext是個對象,是一個命名空間,跟java里頭的package類似,使用Ext下邊的方法、Function/類的時候,就像使用一個對象的屬性一樣,如工具方法Ext.apply、Ext.applyIf可以直接調用,構造函數Ext.json.DataStore,前邊加new創建實例。關于這么做的好處,了解java package的好處的都知道那么一些吧,我只還記得避免命名沖突。

2.2、jQuery首先是個Function,既然是個Function,那個就可以new,可以像Function一樣調用,以下將解析幾種jQuery調用方法的源碼:

jQuery(xxx)的時候,轉調到

Js代碼
  1. newjQuery.fn.init(selector,context,rootjQuery)

具體調用時候就需要分析jQuery.PRototype.init函數了。

2.2.1、jQuery(function(){}),當傳入是function的時候,init方法片段:

Js代碼
  1. elseif(jQuery.isFunction(selector)){
  2. returnrootjQuery.ready(selector);
  3. }

此處rootjQuery默認又等于jQuery(document);ready實際上就是在為document注冊load事件,源碼:

Js代碼
  1. ready:function(fn){
  2. //Attachthelisteners
  3. jQuery.bindReady();
  4. //Addthecallback
  5. readyList.done(fn);
  6. returnthis;
  7. }

bindReady方法是通過attachEvent/addEventListener為document注冊了load事件。

Java代碼
  1. bindReady:function(){
  2. if(readyList){
  3. return;
  4. }
  5. readyList=jQuery._Deferred();
  6. //Catchcaseswhere$(document).ready()iscalledafterthe
  7. //browsereventhasalreadyoccurred.
  8. if(document.readyState==="complete"){
  9. //Handleitasynchronouslytoallowscriptstheopportunitytodelayready
  10. returnsetTimeout(jQuery.ready,1);
  11. }
  12. //Mozilla,Operaandwebkitnightliescurrentlysupportthisevent
  13. if(document.addEventListener){
  14. //Usethehandyeventcallback
  15. document.addEventListener("DOMContentLoaded",DOMContentLoaded,false);
  16. //Afallbacktowindow.onload,thatwillalwayswork
  17. window.addEventListener("load",jQuery.ready,false);
  18. //IfIEeventmodelisused
  19. }elseif(document.attachEvent){
  20. //ensurefiringbeforeonload,
  21. //maybelatebutsafealsoforiframes
  22. document.attachEvent("onreadystatechange",DOMContentLoaded);
  23. //Afallbacktowindow.onload,thatwillalwayswork
  24. window.attachEvent("onload",jQuery.ready);
  25. ……
  26. }
  27. }

2.2.2、jQuery(DOMElement)當傳入參數是一dom element的時候,init方法片段:

Js代碼
  1. if(selector.nodeType){
  2. this.context=this[0]=selector;
  3. this.length=1;
  4. returnthis;
  5. }

把dom元素放到了new出來的init對象上,此處this應該是一個對象,應該是個Object的,但是從Chrome調試看,此時this竟然顯示為jQuery.fn.jQuery.init[0],Object.prototype.toString.call(this)結果是”[object Object]”,是個對象,為何顯示這么奇怪呢?在FF里,this顯示為[],按照道理說,對象應該不會這么顯示的才對。

此處把元素賦值為this[0]可以在后續訪問元素的時候,直接用返回實例的[0]來訪問,如果是多個元素,則可以用下標一個個的訪問,后邊看到selector的時候會看到。同時由于后邊把init的原型指向了jQuery的原型,所以這里this的原型方法都是jQuery.prototype的方法:

Js代碼
  1. jQuery.fn=jQuery.prototype=……
  2. jQuery.fn.init.prototype=jQuery.fn;

挖坑,關于原型方法,實例的關系。

2.2.3、如果傳入是body,jQuery(“body”),返回只有一個body元素

Js代碼
  1. if(selector==="body"&&!context&&document.body){
  2. this.context=document;
  3. this[0]=document.body;
  4. this.selector=selector;
  5. this.length=1;
  6. returnthis;
  7. }

2.2.4、jQuery(selector),如jquery.mobile.js中initializePage中$(“:jqmData(role=’page’)”)

Js代碼
  1. //HandleHTMLstrings
  2. if(typeofselector==="string"){
  3. //ArewedealingwithHTMLstringoranID?
  4. if(selector.charAt(0)==="<"&&selector.charAt(selector.length-1)===">"&&selector.length>=3){
  5. //Assumethatstringsthatstartandendwith<>areHTMLandskiptheregexcheck
  6. match=[null,selector,null];
  7. }else{
  8. match=quickExpr.exec(selector);
  9. }
  10. //Verifyamatch,andthatnocontextwasspecifiedfor#id
  11. if(match&&(match[1]||!context)){
  12. ……//省略幾十行,這一段是避免xss攻擊什么的,沒讀懂,以后再來讀
  13. returnthis;
  14. }
  15. //HANDLE:$(expr,$(...))
  16. }elseif(!context||context.jquery){
  17. return(context||rootjQuery).find(selector);
  18. //HANDLE:$(expr,context)
  19. //(whichisjustequivalentto:$(context).find(expr)
  20. }else{
  21. returnthis.constructor(context).find(selector);
  22. }
  23. }

如果傳入的context為空,就從當前對象查找find(selector)否則就從rootjQuery查找,這里rootjQuery是個實力,所以此方法調用就是調用的原型上的find方法:

Js代碼
  1. jQuery.fn.extend({
  2. find:function(selector){
  3. varself=this,
  4. i,l;
  5. ……//此處省略10+行
  6. varret=this.pushStack("","find",selector),
  7. length,n,r;
  8. for(i=0,l=this.length;i<l;i++){
  9. length=ret.length;
  10. jQuery.find(selector,this[i],ret);
  11. if(i>0){
  12. //Makesurethattheresultsareunique
  13. for(n=length;n<ret.length;n++){
  14. for(r=0;r<length;r++){
  15. if(ret[r]===ret[n]){
  16. ret.splice(n--,1);
  17. break;
  18. }
  19. }
  20. }
  21. }
  22. }
  23. returnret;
  24. }

此處又調用到了jQuery.find方法,注意,jQuery是一個Function,這個find跟rootjQuery不同,jQuery.find是function的一個屬性,非嚴格意義上可以簡單的認為類似于java的靜態方法。此find方法實則是Sizzle本身:

jQuery.find = Sizzle;

具體實現還要看selector的內容,可能是getTagByName或者querySelectorAll,如getTagByName(‘name’)、querySelectorAll(“[data-role=’page’]”)。

2.2.5、jQuery()如果傳入為空,則返回不包含元素的jQuery對象:

Js代碼
  1. if(!selector){
  2. returnthis;
  3. }

2.2.6、jQuery(jQuery()),也就是傳一個jQuery實例進去,會創建一個新對象,然后把老對象的內容拷貝到新對象里頭。

綜上,jQuery()返回的是一個jQuery.prototype.init函數的實例,但是由于這個函數的原型指向了jQuery函數的原型,jQuery.prototype上的方法也可以直接在這個實例上調用。同時jQuery會被當成一個數組來使用,根據下標索引提取滿足參數的dom元素。

2.3、jQuery接著:-)也起到命名空間的作用。

雖然jQuery是個function,但是可以在function上添加屬性(這么叫準確么?)然后就可以直接jQuery.method()、jQuery.filed的調了。這里jQuery至少起到了一個命名空間的作用。

既然說到命名空間了,就不得不說jQuery的原型和function的方法,jQuery.method()類似靜態方法,可以通過

Js代碼
  1. jQuery.method=function(){}
  2. jQuery.extend({method:function(){}})

兩種方法來添加。原型方法則通過jQuery.fn.extend / jQuery.prototype.extend來添加。

3、jQuery和Ext都怎么實現繼承的,有什么異同?各有什么優勢?

Javascript是一門基于對象的語言,但不是面向對象,也就是說語言層面沒有提供繼承的語法,但是可以通過應用層面實現繼承。由于把這種實現放到了應用層面,所以實現就變得五花八門了,可以通過拷貝、原型鏈等。了解兩種繼承的調用方式對理解下邊說到的實現原理是很有幫助的。

3.1、Ext(3.x)的繼承跟《JavaScript高級程序設計》里講到的寄生組

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日韩成人xxxx| 国产精品老女人精品视频| 国产精品h在线观看| 日韩视频精品在线| 国产一区深夜福利| 91日本视频在线| 亚洲最大av网| 国产欧美一区二区三区久久| 日韩精品中文字幕在线播放| 操人视频在线观看欧美| 亚洲已满18点击进入在线看片| 国外成人在线视频| 狠狠躁夜夜躁人人爽超碰91| 欧美色xxxx| 久久99精品久久久久久青青91| 国产精品中文字幕在线| 精品久久久999| 午夜精品福利在线观看| 亚洲免费中文字幕| 欧美日韩亚洲一区二| 91美女高潮出水| 国产精品久久久久999| 成人妇女免费播放久久久| 国产成人精品优优av| 免费不卡欧美自拍视频| 国产成人一区二区三区| 国产精品∨欧美精品v日韩精品| 久久国产精品偷| 精品色蜜蜜精品视频在线观看| 久久精品国产久精国产思思| 欧美日韩午夜视频在线观看| 国产精自产拍久久久久久蜜| 97精品视频在线| 日日骚久久av| 日韩中文字幕网址| 欧美性xxxxxxxxx| 亚洲欧美在线x视频| 国产欧美一区二区| 国产精品入口日韩视频大尺度| 在线观看久久久久久| 国产精品视频最多的网站| 日韩av综合网站| 亚洲国产中文字幕久久网| 国产亚洲欧洲高清| 久久久亚洲欧洲日产国码aⅴ| 疯狂做受xxxx高潮欧美日本| 国产69精品久久久久99| 国产精品一区二区久久精品| 亚洲国产女人aaa毛片在线| 亚洲欧美制服综合另类| 国产极品精品在线观看| 91精品国产综合久久男男| 欧美另类极品videosbestfree| 九九热最新视频//这里只有精品| 亚洲成av人片在线观看香蕉| 成人免费在线网址| 日韩在线www| 久久激情视频免费观看| 欧美老少配视频| 亚洲国产天堂网精品网站| 日韩免费av片在线观看| 亚洲欧美日韩精品| 不用播放器成人网| 另类天堂视频在线观看| 国产日韩精品入口| 久久久久久香蕉网| 日韩精品在线免费观看| 亚洲视频欧洲视频| 国产成人精彩在线视频九色| 国产精品久久久久久久久借妻| 在线观看欧美日韩| 国产成人精彩在线视频九色| 欧美亚洲激情在线| 久久久久久久网站| 欧美精品免费在线| 欧美日韩国产第一页| 亚洲人成电影在线| 日韩精品视频免费在线观看| 亚洲视频一区二区| 久久久精品一区二区| 亚洲一区二区在线| 国产在线a不卡| 在线亚洲欧美视频| 欧美电影在线免费观看网站| 国产精品一区二区三区在线播放| 日韩经典中文字幕在线观看| 亚洲韩国青草视频| 精品丝袜一区二区三区| 中文字幕久热精品视频在线| 国产精品福利在线观看网址| 人九九综合九九宗合| 国产精品人成电影| 久久久www成人免费精品张筱雨| 国产精品久久久久久久久久东京| 中文欧美在线视频| 亚洲第一区中文99精品| 九九热这里只有精品免费看| 国产玖玖精品视频| 欧美视频不卡中文| 久久99久久99精品免观看粉嫩| 国产激情久久久久| 91地址最新发布| 中文精品99久久国产香蕉| 亚洲精品成人网| 亚洲成人久久网| 欧美日韩国产91| 亚洲国产另类久久精品| 在线精品国产欧美| 91高潮精品免费porn| 欧美国产日韩在线| 中文在线不卡视频| 日韩av手机在线看| 精品性高朝久久久久久久| 狠狠躁夜夜躁人人爽超碰91| 一区二区三区动漫| 韩国欧美亚洲国产| 亚洲成人教育av| 91九色单男在线观看| 国产精品尤物福利片在线观看| 久久99国产精品自在自在app| 一本一本久久a久久精品牛牛影视| 亚洲一区美女视频在线观看免费| 91精品国产91久久久久久久久| 亚洲精品视频中文字幕| 国产精品一区二区久久精品| 欧美夫妻性生活xx| 亚洲人成毛片在线播放| 亚洲精品色婷婷福利天堂| 久久久久久久一区二区三区| 成人久久一区二区| 欧美丰满少妇xxxxx做受| 日韩成人在线免费观看| 国内免费精品永久在线视频| 久久久久久成人| 亚洲精品91美女久久久久久久| 国产中文欧美精品| 久久亚洲春色中文字幕| 成人两性免费视频| 在线视频日韩精品| 国产欧美日韩亚洲精品| 在线亚洲欧美视频| 欧美性jizz18性欧美| 国产精品香蕉av| 亚洲一区www| 日韩久久精品电影| 国产精品久久久久久久久久ktv| 国产精品国产三级国产专播精品人| 国产精品草莓在线免费观看| 成人午夜激情网| 国内精品视频久久| 欧美在线一级视频| 国产手机视频精品| 久久成年人视频| 久久精品99无色码中文字幕| 国产精品久久久久福利| 国产精品美女主播| 久久久久久久色| 岛国av午夜精品| 亚洲永久在线观看| 精品欧美国产一区二区三区| 国产日韩精品在线| 久久久久久网站| 一区三区二区视频| 精品久久中文字幕久久av|