jQuery-1.9.1源码分析系列(一)整体架构续
这一节主要是jQuery中最基础的几个东东
2. jQuery的几个基础属性和函数
a. jQuery.noConflict函数详解
在jQuery初始化的时候保存了外部的$和jQuery
_jQuery = window.jQuery, _$ = window.$,
noConflict函数
  noConflict: function( deep ) {
    if ( window.$ === jQuery ) {
         window.$ = _$;
    }
    if ( deep && window.jQuery === jQuery ) {
      window.jQuery = _jQuery;
    }
    return jQuery;
  }
调用noConflict将$甚至jQuery的使用权让渡出去。返回的jQuery保存为自定义的变量。如
var myJq = $.noConflict();
然后就可以将myJq当成jQuery来使用。
var ps = myJq("p");//得到所有p标签的元素集合。
b. jQuery.extend = jQuery.fn.extend函数详解
用户再使用jQuery的时候可能需要对jQuery和jQuery.prototype(jQuery.fn/jQuery(...))进行拓展(添加属性或方法),这个时候使用到extend。
jQuery.extend = jQuery.fn.extend = function(){…}
jQuery.extend是对jQuery本身的拓展;jQuery.fn.extend是对jQuery.fn的拓展,也就是对jQuery.prototype的拓展,最终表现为对jQuery实例$(...)的拓展。
源码分析:源码比较简单,这里不做分析,不过在其中有一个技术点
在使用extend的时候要注意,根据js规则对象变量只有一份的原则,如果浅拷贝中某个属性是通过对象变量获取的值,如果在外部改变了该对象变量,那么拷贝结果也会随着改变。
eg:
  var hd = {name: ‘hard’};
  var pc = {soft: ‘soft’,hdwe:hd};
  var tt = {td: ‘test’};
  var val = $.extend(tt,pc);// {td: "test", soft: "soft", hdwe: { name: ‘hard’}}
  hd.name = 'chenhua';
  //此时val的值为{td: "test", soft: "soft", hdwe: { name: ‘chenhua’ }}
c. jQuery.type函数用来识别对象类型
JavaScript也自带有一个typeof运算符,可以确定数据的类型。不过,对于绝大多数对象而言,typeof运算符都返回"object",无法区分具体的类型。jQuery.type()可以更加精确地确定JS内置对象的类型。 
  class2type = {} ,
  core_toString = class2type.toString, 
  type: function( obj ) {
               if ( obj == null ) {
                      return String( obj );
               }
               return typeof obj === "object" || typeof obj === "function" ?
               class2type[ core_toString.call(obj) ] || "object" :
               typeof obj;
        }
  
  jQuery.each("Boolean Number String Function Array Date RegExp Object Error".split(" "), function(i, name) {
    class2type[ "[object " + name + "]" ] = name.toLowerCase();
  });
代码core_toString.call(obj)使用对象的toString来处理obj得到JS内置对象的类型,得到的结果都是类似"[object Object]"、"[object Function]"、"[object Array]"等样式,最终得到JS内置对象的类型的完全小写形式。
jQuery.type( undefined ); // "undefined"
jQuery.type( null ); // "null" jQuery.type( true ); // "boolean"
jQuery.type( new Boolean(true) ); // "boolean" jQuery.type( 3 ); // "number"
jQuery.type( new Number(3) ); // "number" jQuery.type( "test" ); // "string"
jQuery.type( new String("test") ); // "string" jQuery.type( function(){} ); // "function"
jQuery.type( new Function() ); // "function" jQuery.type( [] ); // "array"
jQuery.type( new Array() ); // "array" jQuery.type( new Date() ); // "date" jQuery.type( new Error() ); // "error" // jQuery 1.9 新增支持 jQuery.type( /test/ ); // "regexp"
jQuery.type( new RegExp("\\d+") ); // "regexp" /* 除上述类型的对象外,其他对象一律返回"object" */ jQuery.type( {} ); // "object"
function User() { }
jQuery.type( new User() ); // "object"
d. jQuery.function和jQuery.fn.function
有的函数是直接绑定到jQuery上的,这种方法只能使用jQuery.function()来调用。而又的方法是绑定到jQuery.fn上的,这种方法一般有两种调用方式jQuery.fn.function()或是jQuery(...).function。
根据jQuery初始化函数jQuery = function(selector,context){
return new jQuery.fn.init(selector,context,rootjQuery);
}应该是易于理解的。jQuery(...)最终返回的上下文环境是jQuery.fn,所以绑定在jQuery.fn的函数最终都是可以通过jQuery(selector,context).function()来调用
e. jQuery.fn.get
//获取当前集合中某一个或是全部的元素
get: function( num ) {
return num == null ?
// Return a 'clean' array
this.toArray() :
// Return just the object
( num < 0 ? this[ this.length + num ] : this[ num ] );
},
需要注意的是,这里返回的是DOM节点对象,非jQuery对象,可不能再链式调用了。
f. jQuery.fn.each和jQuery.each
jQuery.fn.each(callback,args)是对jQuery集合挨个处理,最终调用的还是$.each(obj,callback,args),只不过obj被换成了jQuery匹配的集合。
$.each的obj可以是数组,也可以是对象。如果是数组则遍历数组,如果是对象则遍历对象自身的所有属性(包括函数)。如果$.each没有设置args参数,则遍历过程中调用callBack会将每一个元素的下标(数组是下标,对象是属性名)和值(数组是数组元素,对象是属性对应的值)传递给callBack;否则args会传递给callback(不过这个用的比较少)。
该函数规定为每个匹配元素执行的函数。源码如下
jquery.fn. each: function( callback, args ) {
       return jQuery.each( this, callback, args );
}
使用到了jQuery.each方法,源码如下
jQuery.each: function( obj, callback, args ) {
       var value,
              i = 0,
              length = obj.length,
              isArray = isArraylike( obj );
       if ( args ) {//如果有参数args,代入callback中
              if ( isArray ) {
                     for ( ; i < length; i++ ) {
                            value = callback.apply( obj[ i ], args );
                            if ( value === false ) {
                                   break;
                            }
                     }
              } else {
                     for ( i in obj ) {
                            value = callback.apply( obj[ i ], args );
                            if ( value === false ) {
                                   break;
                            }
                     }
              }
       } else {// 比较通用的是该分支
              if ( isArray ) {//遍历数组
                     for ( ; i < length; i++ ) {
                            value = callback.call( obj[ i ], i, obj[ i ] );
          if ( value === false ) {
                                   break;
                            }
                     }
              } else {
                     for ( i in obj ) {//遍历对象
                            value = callback.call( obj[ i ], i, obj[ i ] );
                if ( value === false ) {
                                   break;
                            }
                     }
              }
       }
  return obj;
}
如果觉得本文不错,请点击右下方【推荐】!
jQuery-1.9.1源码分析系列(一)整体架构续的更多相关文章
- Bootstrap源码分析系列之整体架构
		作为一名合格的前端工程师,你肯定听说过Bootstarp框架.确实可以说Bootstrap框架是最流行的前端框架之一.可是也有人说Bootstrap是给后端和前端小白用的,我认为只要学习它能给我们前端 ... 
- 【Seajs源码分析】1. 整体架构
		seajs是一个非常流行的模块开发引擎,目前项目中使用比较多,为了深入了解已经改进seajs我阅读了他的源码,希望对自己的代码生涯能有所启发. 本文说介绍的是指seajs2.3.3版本. 首先seaj ... 
- jQuery源码分析系列
		声明:本文为原创文章,如需转载,请注明来源并保留原文链接Aaron,谢谢! 版本截止到2013.8.24 jQuery官方发布最新的的2.0.3为准 附上每一章的源码注释分析 :https://git ... 
- [转]jQuery源码分析系列
		文章转自:jQuery源码分析系列-Aaron 版本截止到2013.8.24 jQuery官方发布最新的的2.0.3为准 附上每一章的源码注释分析 :https://github.com/JsAaro ... 
- jQuery源码分析系列(转载来源Aaron.)
		声明:非本文原创文章,转载来源原文链接Aaron. 版本截止到2013.8.24 jQuery官方发布最新的的2.0.3为准 附上每一章的源码注释分析 :https://github.com/JsAa ... 
- jQuery源码分析系列——来自Aaron
		jQuery源码分析系列——来自Aaron 转载地址:http://www.cnblogs.com/aaronjs/p/3279314.html 版本截止到2013.8.24 jQuery官方发布最新 ... 
- jquery2源码分析系列
		学习jquery的源码对于提高前端的能力很有帮助,下面的系列是我在网上看到的对jquery2的源码的分析.等有时间了好好研究下.我们知道jquery2开始就不支持IE6-8了,从jquery2的源码中 ... 
- ABP源码分析一:整体项目结构及目录
		ABP是一套非常优秀的web应用程序架构,适合用来搭建集中式架构的web应用程序. 整个Abp的Infrastructure是以Abp这个package为核心模块(core)+15个模块(module ... 
- jQuery-1.9.1源码分析系列完毕目录整理
		jQuery 1.9.1源码分析已经完毕.目录如下 jQuery-1.9.1源码分析系列(一)整体架构 jQuery-1.9.1源码分析系列(一)整体架构续 jQuery-1.9.1源码分析系列(二) ... 
- MyCat源码分析系列之——结果合并
		更多MyCat源码分析,请戳MyCat源码分析系列 结果合并 在SQL下发流程和前后端验证流程中介绍过,通过用户验证的后端连接绑定的NIOHandler是MySQLConnectionHandler实 ... 
随机推荐
- 怎么可以让div自适应屏幕的高度?(已解决)
			主要解决问题的方法是用JS脚本. 先看布局, 一个div是首部,另一个div是主体,主体包含左侧菜单和右侧内容. 我想把主体div的高度自适应屏幕剩余区域,怎么做? 首先,获取可见区域的高度,docu ... 
- C#:获取设备电量相关信息
			更多资源:http://denghejun.github.io [DllImport("kernel32.dll",EntryPoint="GetSystemPowerS ... 
- Hbuilder开发HTML5 APP之创建子页面
			折腾了好久,终于看明白怎么创建了: 1.创建个html5的mui页面,在其初始化方法中: mui.init({ subpages:[{ id:"list", url: ... 
- 浏览器中CSS的BUG
			对于web2.0的过度,请尽量用xhtml格式写代码,而且DOCTYPE 影响 CSS 处理,作为W3C的标准,一定要加 DOCTYPE声明. 其它请参考:CSS hack 针对IE6,IE7,fir ... 
- .NET开源OpenID和OAuth解决方案Thinktecture IdentityServer
			现代的应用程序看起来像这样: 典型的交互操作包括: 浏览器与 web 应用程序进行通信 Web 应用程序与 web Api (有时是在他们自己的有时代表用户) 通信 基于浏览器的应用程序与 web A ... 
- .NET中XML序列化的总结
			[题外话] 以前虽然常用.NET中的序列化,但是常用的BinaryFormatter,也就是二进制文件的序列化,却鲜用XML的序列化.对于XML序列化,.NET中同样提供了一个非常方便的工具XmlSe ... 
- .NET中操作IPicture、IPictureDisp的小随笔
			[题外话] 最近在做一个调用某实验仪器的程序,这个仪器提供了Windows上COM的接口.调用仪器的时候需要传输图片,提供的接口里使用了IPicture这个接口,由于以前没接触过,所以查找了一些资料, ... 
- ANDROID下面的游戏更新目录
			更新模块的整体方案终于搞定了,包括launcher的自更新,以及framework,app等代码的更新,均测试通过. 很激动地拿到ANDROID上去测试,一下就傻眼了. 在创建upd目录的时候,就遇上 ... 
- SharpFileDB - a file database for small apps
			SharpFileDB - a file database for small apps 本文中文版在此处. I'm not an expert of database. Please feel fr ... 
- Hystrix框架5--请求缓存和collapser
			简介 在Hystrix中有个Request的概念,有一些操作需要在request中进行 缓存 在Hystrix调用服务时,如果只是查询接口,可以使用缓存进行优化,从而跳过真实访问请求. 应用 需要启用 ... 
