如果是做 web 的话,相信都要对 Dom 进行增删查改,那大家都或多或少接触到过 jQuery 类库,其最大特色就是强大的选择器,让开发者脱离原生 JS 一大堆 getElementById、getElementsByName...官方提供超长方法 api 。

jQuery 整体源码,本人也还在阅读中,暂时记录一下。(为什么要看源码,原因很简单---- 一 好好了解一下 jQuery 原理  二 为了装逼显摆)。

  一  使用 jQuery 时候,首先需引入 jQuery 文件,而之后,大家即可直接使用 $ 、jQuery  调用。为什么呢?

想必,写过 javascript 的同学,都知道 window 是 top 对象,而像 document、location、navigator 等为 window 下属性,为了方便使用,可以省略 window. ,那么,jQuery 同样原理。

在源码中 $、jQuery 同样是采用此种方法引入 window.$=window.jQuery=xxx。如图所示,图中页面引入了 jQuery 库。

// Expose jQuery to the global object
window.jQuery = window.$ = jQuery;

 二   jQuery 库使用过程中,一般使用两种形式,一种即为 $.ajax、$.noConflict ,另一种则为 $(方法参数) 进行使用

          通过源码可知,jQuery 本身为一个 function ,而 $.ajax 、$.noConflict 可以视为该函数对象添加的静态方法,而使用的 $() 即相当于调用 $ 函数方法。

         

	jQuery = function( selector, context ) {
// The jQuery object is actually just the init constructor 'enhanced'
return new jQuery.fn.init( selector, context, rootjQuery );
},

  三  jQuery 源码中自执行函数作用,以及自执行函数中传入的 window 、undefined 的作用 ?

           

(function( window, undefined ) {

.......

})(window);

          自执行函数:自动执行该函数,用户在外面无法手动调用,且自执行一次。 自执行函数相当于创建了一个特殊的作用域,而该作用域封闭,避免污染全局变量。  以下仅列举两种常见写法。

           ( function (){

            函数体

           })();

         

        + function  A(){

            函数体

          }();

          而在 jQuery 源中,方法传入了 window 、undefined 两个参数。

         window:因为函数在调用时,其查找变量值时,需一级一级往上查找,如果当前函数作用域没有该变量,将会往上一级继续查找,直接传入 window ,可减少查找时间,提高效率。

          undefined:经楼主测试在 IE 8 下, undefined 属性值可进行修改,此时传入参数undefined 应该时保持 undefined 初始值。

         

      四   简谈 JavaScript 原型

        原型:JavaScript 对象有一个指向一个原型对象的链。当试图访问一个对象的属性时,它不仅仅在该对象上搜寻,还会搜寻该对象的原型,以及该对象的原型的原型,依此层层向上搜索,直到找到一个名字匹配的属性或到达原型链的末尾。简而言之,即在 JavaScript 中,任意对象的 __proto__ 属性 (原型)(而其值等于该对象构造函数的 prototype 属性 ,obj.__proto__===obj.constructor.prototype 。)

目前,也可通过 Object.getPrototypeOf( arg ) 方法获取对象原型,参数 arg 即为当前对象 .

Object.getPrototypeOf( obj)===obj.__proto__===obj.constructor.prototype。在 JS 中,即通过原型实现继承,当在该前对象的自身属性中查找不到相关方法属性,再往其 __proto__ 属性中查找,如果再查找不到,再往其 __proto__属性值的 __proto__一级一级往上查找,从而形成原型链,顶级的 Object.prototype.__proto__ 为 null,最终为止。

而在 jQuery 中,像使用的 jQuery.ajax 等方法可视为 jQuery 该函数对象(在 JS 中,任意都视为对象)拥有的静态方法 ,而类似 jQuery(参数).css() 等方法,可视为通过 jQuery 函数对象为构造器创建的对象,而其拥有的方法属性,则来自 jQuery.prototype 中(对象的 __proto__ 等于该对象的构造函数的 prototype 属性)。

五 jQuery 源码中原型使用

          

 // 首先,在执行函数中定义 jQuery 变量,而 jQuery 变量为一个 function 。
jQuery = function( selector, context ) {
// 在 jQuery 函数体中 ,通过 new jQuery.fn.init 为构造器函数,返回新的对象。
通过上面原型原理可知,该创建对象的 __proto__ (原型)指向其构造函数的 prototype 属性 (jQuery.fn.init.prototype)
return new jQuery.fn.init( selector, context, rootjQuery );
}, // 将 jQuery 函数对象 prototype 属性另起别名 : jQuery.fn=jQuery.prototype
同时,将 jQuery.protype 重新赋值 ,将其 constructor 指向 jQuery 函数对象 ,新增 init 属性(同样,为一个函数对象,jQuery 函数体中就通过调用该方法创建对象),
还增加了一些属性及方法,比如:selector 、jQuery 、size 等方法属性
jQuery.fn = jQuery.prototype = {
constructor: jQuery,
init: function( selector, context, rootjQuery ){
.....
},
// Start with an empty selector
selector: "", // The current version of jQuery being used
jquery: "1.8.3", // The default length of a jQuery object is 0
length: 0, // The number of elements contained in the matched element set
size: function() {
return this.length;
},
.......
};
// 将 jQuery.fn.init.prototype 指向 jQuery.fn ,这一步相当重要
jQuery.fn.init.prototype = jQuery.fn;

六 jQuery 中 $ 别名与其它库引起冲突解决

       在 jQuery 源码,可发现作者为了便于用户使用,将 jQuery 以 window.jQuery 方式引入,同时,又为 jQuery 另起别名 $,因此,用户在代码不仅可以使用 jQuery,更可以使用简便的 $ 。(jQuery.fn 为 jQuery.prototype 的别名)

而在众多的 javascript 类库,除了 jQuery ,另也有其它库,使用 $ 为别名,比如 prototype,如果在一个页面,同时,引入了 jQuery.js、prototype.js 就会引起冲突问题,因为两者都使用 $ 为别名。

接下来看看 jQuery 源码中提供的解决办法。

       // 首先,在 jQuery 源码起始部分定义变量 _jQuery、_$ 值,以保存先前 jQuery、$ 真实值
// 此时,可想象页面分别按顺序引入 prototype.js、jquery.js
// 页面运行 prototype.js ,此时,$、jQuery 为 prototype 类库所持有
// 当运行 jQuery.js ,因为,在 jQuery.js 中,又重新赋值了 jQuery、$
因此,先将前一个类库所持有的值进行保存。
_jQuery = window.jQuery,
_$ = window.$, // 再看看,jQuery 自身扩展的静态方法 :noConflict
// 其函数体,就是实现将先前保存前一个类库中的 _$、_jQuery 中重新归还原来库
jQuery.extend({
noConflict: function( deep ) {
if ( window.$ === jQuery ) {
window.$ = _$;
} if ( deep && window.jQuery === jQuery ) {
window.jQuery = _jQuery;
} return jQuery;
})

     

         未完待续

   

     

      

    

 

  

 

jQuery 源码解析一:jQuery 类库整体架构设计解析的更多相关文章

  1. jQuery源码分析之=>jQuery的定义

    最近写前段的代码比较多,jQuery是用的最多的一个对象,但是之前几次看了源码,都没搞清楚jQuery是怎么定义的,今天终于看明白怎么回事了.记录下来,算是一个新的开始吧. (文中源码都是jQuery ...

  2. jQuery 源码学习 - 02 - jQuery.fn.extend 与 jQuery.extend

    参考资料:[深入浅出jQuery]源码浅析--整体架构,备用地址:chokcoco/jQuery-. extend 方法在 jQuery 中是一个很重要的方法.jQuery 内部用它来拓展静态方法或者 ...

  3. jQuery 源码分析4: jQuery.extend

    jQuery.extend是jQuery最重要的方法之一,下面看看jQuery是怎样实现扩展操作的 // 如果传入一个对象,这个对象的属性会被添加到jQuery对象中 // 如果传入两个或多个对象,所 ...

  4. jQuery 源码分析3: jQuery.fn/ jQuery.prototype

    // 建立方法实例,提高方法访问的速度(避免在原型链上搜索) var deletedIds = []; var slice = deletedIds.slice; var concat = delet ...

  5. 大家都能看得懂的源码(一)ahooks 整体架构篇

    本文是深入浅出 ahooks 源码系列文章的第一篇,该系列已整理成文档-地址.觉得还不错,给个 star 支持一下哈,Thanks. 第一篇主要介绍 ahooks 的背景以及整体架构. React h ...

  6. jQuery 源码分析6: jQuery 基本静态方法(二)

    jQuery.extend({ // 遍历obj的所有值 // args 这参数只能内部调用的会用到 // 注意到,如果回调函数调用失败会直接跳出并中止遍历 // 当有args数组时,使用apply调 ...

  7. jQuery 源码分析5: jQuery 基本静态方法(一)

    jQuery在初始化过程中会为自己扩展一些基本的静态方法和属性,以下是jQuery 1.11.3版本 239 ~ 564行间所扩展的静态属性和方法   jQuery.extend({ // 为每个jQ ...

  8. jQuery 源码分析2: jQuery.fn.init

    //jQuery.fn.intit 中使用到的外部变量: // 判断是否为HTML标签或#id rquickExpr = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w ...

  9. 六.jQuery源码分析之jQuery原型属性和方法

    97 jQuery.fn = jQuery.prototype = { 98 constructor: jQuery, 99 init: function( selector, context, ro ...

随机推荐

  1. Linux shell下批量创建缩略图

    一.背景 今天,突然发现手机客户端上的最新新闻缩略图都不显示了,上服务器上看了看, 发现新的新闻图片根本没有生成缩略图. 这套新闻发布系统是很老的程序了,查了一下,问题的原因是不支持png格式的图片, ...

  2. MVC&WebForm对照学习:传值方式

    刚从webform开发转到mvc,如果说像路由这样稍微复杂一点的知识点还可以暂时先放一放(前提是默认的路由规则基本满足大部分需求),那有个问题在快速开发中,我想是必须要当即解决的,那就是webform ...

  3. Java中的DeskTop类使用介绍

    在Jdk1.6以后新增加了一个类--DeskTop,在JDK中它的解释是这样的: The Desktop class allows a Java application to launch assoc ...

  4. 关于ThinkPHP中Session不能夸模块/控制器使用的问题-网上的答案我做个补充

    1,确保c:/windows目录下有php.ini文件2,修改php.ini中的session.auto_start = 0 为 session.auto_start = 1  //设置自动开启ses ...

  5. WinForm使用webbrowser爬取数据,中文乱码问题

    使用winform中的webbrowser抓取某个网站的数据时,遇到中文乱码的问题: 当时使用的获取网页内容的代码为: webBrowser1.DocumentText.ToString(); 不管我 ...

  6. LoadRunner检查点实战

    码农博客 即将到期,现将博客中部分文章转载到博客园.转载时略有删减. 一.为什么要使用检查点 为什么要使用检查点,那就要说明一下LR如何判断脚本是否执行成功. LR判断脚本是否执行成功是根据服务器返回 ...

  7. 常见设计模式解析和实现(C++)FlyWeight模式

    作用:运用共享技术有效地支持大量细粒度的对象 UML结构图: 解析: Flyweight模式在大量使用一些可以被共享的对象的时候使用.比如,在QQ聊天时很多时候你懒得回复又不得不回复,一般会用一些客套 ...

  8. 关于DISPLAY变量显示问题

    DISPLAY用来设置将图形显示到何处 在本机上直接登录之后,startx,可以发现display变量自动设置为 [oracle@kel ~]$ echo $DISPLAY :0.0 不论使用何种用户 ...

  9. Echarts显示全球dns server物理位置

    今天YY给了我一大串dns server的ip,然后提出将这些ip物理位置显示在世界地图上(仅仅显示每个地区有几个dns server就好),苦逼了一下午,总算告一段落.把里面关键的点贴上来以后看.. ...

  10. 状压DP uvalive 6560

    // 状压DP uvalive 6560 // 题意:相邻格子之间可以合并,合并后的格子的值是之前两个格子的乘积,没有合并的为0,求最大价值 // 思路: // dp[i][j]:第i行j状态下的值 ...