日期:2014-05-16  浏览次数:20290 次

ExtJS与jQuery的一点细节上的对比

? ? ??首先说明这不是一篇完整解读ExtJS和jQuery所有方面差异的文章,只是针对我个人刚看了两天的jQuery产生的一些疑问的整理。之前用过一段时间ExtJS,了解ExtJS的一些机制。现在做移动开发,又选定了jquery mobile,要写控件,所以需要了解jquery。(不过换工作之后应该不会再用jQuery了,坑估计是短期内填不上了)

1、jQuery是个什么东西?Ext是什么东西?(此处不是指两个框架,而是指我们在写程序的时候,经常用到的两个关键字--暂时称之为关键字)

? ? 之前用的是ExtJS,Ext是个Object,通过字面量创建的,Ext.js文件里,3.3.1版:?

Ext = {
 version : '3.3.1',
 versionDetail : {
  major : 3,
  minor : 3,
  patch : 1
 }
}; 

? ? ??4.0版本,此处global == window:

if (typeof Ext === 'undefined') {
     global.Ext = {};
}

? ? 既然Ext是个Object,那jQuery是不是也是个Object呢?NO,来分析下源码,jquery.js:

var jQuery = (function() {
  // Define a local copy of jQuery
  var jQuery = function( selector, context ) {
    // The jQuery object is actually just the init constructor 'enhanced'
    return new jQuery.fn.init( selector, context, rootjQuery );
   },  
   ...//此处省略900行
  return jQuery;
})();

? ? 此处大概明白了,jQuery是个Function,并且由于此处调用jQuery的时候,有个return,所以var v = jQuery(xxx)和var v = new jQuery(xxx)调用后,v都是同一个函数的实例。在《JavaScript高级程序设计》第18章第一节有提到过这种技巧,叫做作用域安全的构造函数,不过书上提到的形式稍有差异:

function Person(name,age){
   if(this instanceof Person){
      this.name = name;
      this.age = age;
   }else{
      return new Person(name,age);
   }
}

? ?? 这样var p = Person('a',21)和var p = new Person('a',21) ,p就都是Person实例了,如果去掉if判断和else后边的内容,第一种调用p是undefined。

? ? 在jquery.js最后,把变量jQuery赋值给了$,后续可以通过$这种简写使用jQuery,算是一个简写的别名吧:

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)的时候,转调到

new jQuery.fn.init(selector,context,rootjQuery)?

具体调用时候就需要分析jQuery.prototype.init函数了。

? ? ? ? ?2.2.1、jQuery(function(){}),当传入是function的时候,init方法片段:

           else if ( jQuery.isFunction( selector ) ) {
               return rootjQuery.ready( selector );
           }

?? ? ? ? 此处rootjQuery默认又等于jQuery(document);ready实际上就是在为document注册load事件,源码:

     ready: function( fn ) {
           // Attach the listeners
           jQuery.bindReady();
           // Add the callback
           readyList.done( fn );
           return this;
        }

?? ? ? ??bindReady方法是通过attachEvent/addEventListener为document注册了load事件。