




已阅读5页,还剩8页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
总体架构jQuery是个出色的javascript库,最近结合它写javascript,看了下源码。 先从整体、全局的看,jQuery的源码几乎都在下面的代码中:(function() /)();第一个括号里面是个匿名函数,第二个括号表示马上执行第一个括号里面的代码。首先明白,javascript里面是没有命名空间的,要保证你的javascript函数、对象与其他的不冲突,这里用了javascript的一个技巧:你的所有javascript函数、对象都在一个匿名函数里面定义,确保了所定义的函数、对象的有效范围,起到了命名空间的作用。既然作用范围在这个匿名函数中,怎么被别人使用呢?下面看它的下面代码:var jQuery = window.jQuery = function(selector, context) /;这里让jQuery库中最重要的对象jQuery成为了window对象的一个属性,这样就可以在其他地方像使用document(document也是window的一个属性)一样使用jQuery了。也许使用过jQuery的朋友惊讶我没有使用jQuery对象,一直使用$的。没错,那是jQuery的同名对象:window.$ = jQuery;现在明白了吧。执行过程分析JavaScript是一门基于对象的语言,而它的对象技术的实现又和其他语言有着很大的差异,在JavaScript中,一个类的定义一般采用下面这种模式(我所看到的): / 定义一个构造函数;testClass(param1, param2) this.attr1 = param1;this.attr2 = param2; ./ 在prototype对象上扩展,加上相应的方法;testCtotype = Method1: function() ., Method2: function() ., ./ 定义一个实例;var test = new testClass();在jQuery.js中,同样也是这种模式,只不过它要复杂很多,而且它还定义了一个jQuery.extend()的静态方法来扩展类的功能,jQuery.js代码执行过程完整分析如下:/ 防止多次载入而进行jQuery对象的判断;if ( typeof window.jQuery = undefined ) window.undefined = window.undefined;/ jQuery的构造函数;var jQuery = function( a, c ) . ;/ jQuery的命名空间$;if ( typeof $ != undefined ) jQuery._$ = $;var $ = jQuery;/ 给jQuery的prototype增加一些基础方法和属性;/ 其中有些方法是调用下面的扩展方法实现的;/ 注意下面的jQuery.fn = jQtotype; jQuery.fn = jQtotype = each: function( fn, args ) . , find: function( t ) . , . ;/ jQuery实现继承的方法; jQuery.extend = jQuery.fn.extend = function( obj, prop ) .;/ 实现一些基础的函数,有大部分是上面调用; jQuery.extend( init: function() . , each: function( obj, fn, args ) . , find: function( t, context ) . , . );/ 浏览器版本的检测;new function() jQuery.browser = safari:., opera:., msie:., mozilla:. ; . ;/ jQuery.macros扩展,主要用于jQuery.init(),进行jQuery的初始化; jQuery.macros = filter: . , attr: . , each: . , . ;/ jQuery初始化; jQuery.init();/ 实现jQuery的重要方法ready(); jQuery.fn.extend( ready: function( f ) . . ;/ 上面ready()方法的具体实现; jQuery.extend( ready: function() . , . ;/ 对浏览器某些事件进行绑定和解绑定;new function() . jQuery.event.add( window, load, jQuery.ready ); ;/ 当IE浏览器关闭时,清除上面绑定的事件,防止内存泄漏;if ( jQuery.browser.msie ) jQuery(window).unload( . );/ 实现一些浏览器效果; jQuery.fn.extend( show: function( speed, callback ) . , hide: function( speed, callback ) . , . ;/ 上面的一些函数具体实现; jQuery.extend( . );/ 以下都是Ajax的实现,这里声明原型,具体实现调用下面的函数; jQuery.fn.extend( loadIfModified: function(url, params, callback ) . , . ;/ 针对IE浏览器创建不同的XMLHttpRequest对象;if (jQuery.browser.msie & typeof XMLHttpRequest = undefined) . ;/ Ajax函数的绑定;new function() var e = ajaxStart,ajaxStop,ajaxComplete,ajaxError,ajaxSuccess.split(,); . ;/ Ajax函数的具体实现; jQuery.extend( get: function( url, data, callback, type, ifModified ) . , post: function( url, data, callback, type ) . , ajax: function( type, url, data, ret, ifModified ) . , . 构造函数详解在jQuery.js的构造函数中,充分利用了JavsScript语言的动态性对行参的类型和个数没有的严格要求,以至于一个函数可以实现多种功能需求,也为JavaScript语言的多态性提供了基础,在这个构造函数中,提供了六种不同的调用格式(根据官方API文档),具体如下($ = jQuery): 1、$(String expr):根据给定的CSS选择符查找匹配的元素,如$(divp);2、$(Element elem):将给定的DOM元素对象转换为jQuery对象,如$(document).find(divp);3、$(Array elems):如$(myForm.elements).hide();4、$(Function fn):是$(document).ready()的简写模式,如:$( function fn() . );5、$(jQuery obj):如:var div = $(div); $(div).find(p);6、$(String expr, Element context):在context中查找expr,如:$(div, xml.responseXML);另外,jQuery中提到了Chainable Methods的思想,也就是调用jQuery中的方法会返回一个jQuery对象,仍然可以继续调用其中的方法,这样,就形成了一个“链条”,通过“.”一个一个调用下去,这个在构造函数中有具体体现,其中有如下一条语句:if( window = this ) return new jQuery( a, c );这个就是为了返回一个jQuery对象,在首次调用jQuery( a, c )函数时,this是等于window的,所以每次都会创建一个jQuery对象,更详细的代码分析见下:/ jQuery的构造函数;var jQuery = function( a, c ) / $(document).ready()的简写形式,只有在$(function()下才会执行;if ( a & typeof a = function & jQuery.fn.ready ) return jQuery(document).ready(a);/ 确保参数a非空,默认值为document; a = a | jQuery.context | document;/ 如果参数a是jQuery对象(a.jquery=1.0.3),则克隆一个与a相同的jQuery对象;if ( a.jquery ) return jQuery( jQuery.merge( a, ) );/ 从给定的参数c(要求c必须是jQuery对象)中查找a;if ( c & c.jquery ) return jQuery( c ).find( a );/ 如果是初次调用$(),因为在window环境下,所以创建一个新的jQuery对象,如果去掉new则循环执行;if ( window = this ) return new jQuery(a,c);/ 分析HTML串,如“divp”;if ( a.constructor = String ) var m = /*()*$/.exec( a );if ( m ) a = jQuery.clean( m 1 ); / 如果参数a是元素数组,则要执行jQery.merge(),否则要执行jQuery.find();this.get( a.constructor = Array | a.length & !a.nodeType & a0 != undefined & a0.nodeType?/ 处理元素数组; jQuery.merge( a, ) :/ 查找相匹配的元素并保存; jQuery.find( a, c ) );/ 如果附加了另外的函数,则在每个相匹配的jQuery对象上执行这个函数;var fn = arguments arguments.length - 1 ;if ( fn & typeof fn = function ) this.each( fn );return this; /jQuery的结束;插件扩展机制从零开始写jQuery框架摘要: 本文由简到繁地介绍了以jQuery作为蓝本的js框架开发步聚, 希望借助本文大家对jQuery这样的框架内部有一个大致的认识。随着时代发展,javascript阵营里面出现了越来越多的优秀的框架,大大简化了我们的开发工作,在我们使用这些框架的时候是不是也应该饮水思源想想它们都是怎样构建起来的呢?如果你不满足于仅仅是使用一些现成的API,而是深入了解它们内部的实现机制(照某人的说法, API是贬值最快的东西),最好的办法就是阅读它们的源代码了,前提是你读得懂。最近两天研究了一下jQuery的源码,在这里将本人一些粗浅认识分享出来,不当之处请各位指正。好了,下面我们就来看看jQuery大概是怎样工作的,我假定你已经具备了一些基本的javascript知识,如果基础不够俺推荐你阅读JavaScript高级程序设计和悟透JavaScript这两本书。本文不适合对js里面的类、对象、函数、prototype等概念没有了解的朋友。我们从最开始的说起:首先构造一个对象给使用者,假定我们这个框架叫 Shaka ( 俺的名字;) )var Shaka = function(); 这里我们创建了一个空函数,里面什么也没有,这个函数实际上就是我们的构造函数。为了让我们生成的对象能够调用在prototype里定义出来的方法, 我们需要用原型的方式(把Shaka当作是一个类)给Shaka添加一些方法,于是定义:Shaka.fn =Stotype = ; 这里的Shaka.fn相当于Stotype的别名,方便以后使用,它们指向同一个引用。OK,我们添加一个sayHello的方法, 给Shaka添加一个参数,这样这个框架最基本的样子已经有了,如果它有生命的话那么它现在是1岁, 看代码:Error! Reference source not found.提示:您可以先修改部分代码再运行好啦,先别激动, 我们注意到这个框架跟jQuery在使用上是有一些差别的, 比如在jq 中我们可以这样写jQuery(#myid).someMethod(); 这是怎样做到的呢, 也就是说 jQuery()这个构造函数返回了一个jQuery的对象实例,因此我们可以在上面调用它的方法,所以Shaka的构造函数应该返回一个实例,它看起来应该是这个样子:var Shaka = function() return /返回Shaka的实例; ; 那么我们要如何取得一个Shaka的实例呢, 我们先来回顾一下使用prototype方式来模拟类的时候 var someObj = newMyClass(); 这个时候实际上是创建一个新对象someObje,把新对象作为this指针,调用 MyClass函数,即类的构造函数, 然后 someObj 就获得了在 MyCtotype里面定义的方法, 这些方法内的this指针指当前对象实例。在jQuery中使用了一个工厂方法来创建一个实例,这个方法位于jQtotype中, 现在我们重新来定义Stotype, 给它添加一个init方法用于返回一个Shaka的实例, 并且把Shaka的构造函数稍稍改变一下:var Shaka = function(age) return new Shaka.fn.init(age); ;Shaka.fn = Stotype = init: function(age) this.age = age; return this; , sayHello: function() alert(I am a little baby, my age is + this.age + years old.); ;Stotype = Shaka.fn;/这里new Shaka.fn.init(age)创建的对象具有init方法的prototype指向对象的方法 , 因此我们将init方法的prototype指向 Shaka的prototype, 这样创建出来的对象就具有了Stotype里面定义的方法。OK,现在我们的小宝宝变成大一点的宝宝了,打个招呼先:Error! Reference source not found.提示:您可以先修改部分代码再运行嗯,好象有点样子了,但是光这样还不行,来点实际的, 我们在新框架中实现jquery里val()方法的部分功能,这个方法不加参数调用时返回指定ID的input的值,加参数时为设定这个input的值,与jQery一样,我们约定使用id来查找对象时使用#符号。把要查找的目标ID作为构造函数的参数传进去,我们给Stotype添加一个val()方法, 给Shaka添加一个selector的属性用于存储我们要查找的目标。:Shaka.fn = Stotype = init: function(selector) this.selector = selector; return this; , val: function(newValue) /方法实现代码 ;var Shaka = function(selector) return new Shaka.fn.init(selector); ;提示:您可以先修改部分代码再运行到目前为止我们已经创建一个可以工作的框架雏形,为了使程序可以更方便地被调用,比如jQuery可以使用$符号来简写,我们也弄一个,在此之前我们先来回顾两个东西:1. 我们在脚本中可以这样定义变量:var foo = someThing; bar = otherthing;这样两种写法都是合法的,但是意义完全不同, 第一个语句创建了一个新的变量,而第二个是定义了window对象的一个属性,相当于window.bar = otherthing;, 因此我们想使我们的Shaka具有这样的调用方式能力: $.someMethod();就需要将Shaka设置为window的一个属性, 于是我们的Shaka构造函数就得写成这样:var Shaka = window.Shaka = window.$ = function(s
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 高中中秋节课件
- 四川中考英语真题模拟试卷含参考答案 5份
- 非银金融行业市场前景及投资研究报告:寿险公司负债成本改善
- 高一必修二《离骚》课件
- 夫妻离婚协议书:涉及借款清偿及房产分割的详细条款
- 环评技术咨询与项目可行性研究合同
- 品牌季度广告代理服务合同
- 大学实验室验收标准制定方案
- 企业人才流失原因分析和预防措施
- 提高营销团队的执行效率
- 星火英语六级词汇大全(带音标)
- 土地勘测定界技术方案
- 小学语文人教四年级上册第一单元《习作推荐一个好地方》
- 体育教学论-课件
- 医生岗位月度绩效考核表(KPI)
- 人教版数学四年级上册教学计划
- 一等奖课件:黄金分割
- 跨系学生矛盾纠纷处理流程图
- 小学数学苏教版六年级上册《长方体和正方体整理与复习》课件(公开课)
- Q-RJ 557-2017 航天型号产品禁(限)用工艺目录(公开)
- 国际商务谈判第二章影响国际商务谈判的因素
评论
0/150
提交评论