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实 ...
随机推荐
- 谢欣伦 - 原创软件 - 工具软件 - 快速关机Shutdown
快速关机Shutdown,含源码. 公司公用的笔记本电脑实在太烂,不知从什么时候开始关机永远都关不了,一直停留在“关闭系统中……”.忍无可忍之下,自己写了一个快速关机程序. 下载: Shutdown_ ...
- CAD调试时抛出“正试图在 os 加载程序锁内执行托管代码。不要尝试在 DllMain 或映像初始化函数内运行托管代码”异常的解决方法
这些天重装了电脑Win10系统,安装了CAD2012和VS2012,准备进行软件开发.在调试程序的时候,CAD没有进入界面就抛出 “正试图在 os 加载程序锁内执行托管代码.不要尝试在 DllMain ...
- 关于HTML是什么,能做什么
HTML(Hyper Text Mark-up Language )即超文本标记语言,是 WWW 的描述语言,由 Tim Berners-lee提出.设计 HTML 语言的目的是为了能把存放在一台电脑 ...
- WPF - 属性系统 (1 of 4)
本来我希望这一系列文章能够深入讲解WPF属性系统的实现以及XAML编译器是如何使用这些依赖项属性的,并在最后分析WPF属性系统的实际实现代码.但是在编写的过程中发现对WPF属性系统代码的讲解要求之前的 ...
- Kosaraju 算法检测有向图的强连通性
给定一个有向图 G = (V, E) ,对于任意一对顶点 u 和 v,有 u --> v 和 v --> u,亦即,顶点 u 和 v 是互相可达的,则说明该图 G 是强连通的(Strong ...
- 剑指Offer面试题:2.二维数组中的查找
一.题目:二维数组中的查找 题目:在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. ...
- 剑指Offer面试题:8.斐波那契数列
一.题目:斐波那契数列 题目:写一个函数,输入n,求斐波那契(Fibonacci)数列的第n项.斐波那契数列的定义如下: 二.效率很低的解法 很多C/C++/C#/Java语言教科书在讲述递归函数的时 ...
- 剑指Offer面试题:23.二叉树中和为某一值的路径
一.题目:二叉树中和为某一值的路径 题目:输入一棵二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径.从树的根结点开始往下一直到叶结点所经过的结点形成一条路径.例如输入下图中二叉树和整数2 ...
- 《3D Math Primer for Graphics and Game Development》读书笔记2
<3D Math Primer for Graphics and Game Development>读书笔记2 上一篇得到了"矩阵等价于变换后的基向量"这一结论. 本篇 ...
- 《深入浅出Nodejs》—— 读后总结
这一个月过去了三分之二,加上之前看过这本书三分之一,这才算是看完. 虽然看完一遍,但是这本书内容很深,以后肯定是还要继续翻阅的..... 什么是Nodejs Nodejs有几个特性:异步IO,事件驱动 ...