日期:2014-05-16 浏览次数:20313 次
? ? ??首先说明这不是一篇完整解读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事件。