三.jQuery源码解析之jQuery的框架图

这张图片是对jQuery源码截图,一点一点拼出来的.
        现在根据这张图片来对jQuery框架做一些说明.
        一.16~9404行可以发现,最外层是一个自调用函数.当jQuery初始化时,这个自调用函数包含的所有js代码都会被执行.
        二.在22行中声明的jQuery变量最终接受的是内部创建的jQuery构造器函数.
            这个变量在9284行中被赋值给了window.jQuery属性.此时的jQuery可以被外界访问到了,并且也有了别名$.
        三.97~319行,对jQuery的原型进行了重写.因为重新原型必然导致constructor的默认指向的改变,
            所以98行重新对constructor属性进行了设置.
            99行上,定义了原型上的方法jQuery.fn.init(),它负责解析参数selector和context的类型并执行相应的查找;
            在27行上可以看到,当我们调用jQuery时,return的是jQuert.fn.init()的实例,
            在init()后面还定义了一大堆的属性和方法,
            例如selector,length,size(),toArray(),get()....在图中就没有显示出来了.
        四.从322行可以看出很奇怪想象.jQuery的原型覆盖了jQueryfn.init()方法(构造器)的原型对象.
            25~28行.我们调用jQuery方法时,内部调用的是jQuery.fn.init(),也就是说我们访问的应该是
            jQuery.fn.init()原型中的属性,方法,可是我们为什么还可以访问到jQuery原型的属性和方法.
            例如$("div").length;这个时候就可以从jQuery.fn.init.prototype=jQuery.fn;中找到答案了.
        五.324行定义了jQuery.extend()和jQuery.fn.extend(),用于合并两个或多个对象的属性到第一个对象,
            388~918行执行jQuery.extend()在jQuery构造函数三定义了一堆静态属性,
            如:noConflict(),isReady,readyWait,holdReady()
六.使用过jQuery的人都知道,我们想要获取到一个jQuery对象,只需要这样写就可以了:$("#guo")或jQuery("#guo").
            可是在js中我们通过构造器来实例化一个对象通常都是这种写法:new Fun().
            为什么获取jQuery对象不需要使用new关键字呢?从25~28行可以找到答案.因为jQuery在构造器内部使用new创建了
            一个对象,并且返回回来,这样大大的简化了在使用jQuery时的代码量.
        七.从322行中看到,jQuery.prototype和jQuery.fn使用得是同一个引用.
            这样做有一个好处,就是在使用jQuery原型时,可以直接使用jQuery.fn,这样比jQuery.prototype少些7个字符,
            这也符合"write less,do more"思想.
        八.22~983行是一个自执行函数,返回结果最终是内部jQuery变量,
            为什么不直接去掉25行的函数,在22行代码上使用25行的效果.
            981行这样写:return new jQuery.fn.init(.....).
            如果这样写的话,就会增加了jQuery各个模块的耦合度.在25~97行中,定义了许多的局部变量,
            而这些函数只需要在构造jQuery对象时才使用.所以jQuery的这种做法是一个高内聚低耦合的设计思想.
        九.为什么重写jQuery的原型.在原型对象上定义的属性和方法会被所有jQuery对象继承,
            可以有效减少每个jQuery对象所需的内存.因此不必担心jQuery拥有太多的属性和方法而担心占用太多的内存.
三.jQuery源码解析之jQuery的框架图的更多相关文章
- jquery源码解析:jQuery数据缓存机制详解2
		
上一课主要讲了jQuery中的缓存机制Data构造方法的源码解析,这一课主要讲jQuery是如何利用Data对象实现有关缓存机制的静态方法和实例方法的.我们接下来,来看这几个静态方法和实例方法的源码解 ...
 - jquery源码解析:jQuery数据缓存机制详解1
		
jQuery中有三种添加数据的方法,$().attr(),$().prop(),$().data().但是前面两种是用来在元素上添加属性值的,只适合少量的数据,比如:title,class,name等 ...
 - jquery源码解析:jQuery工具方法when详解
		
我们先来看when方法是如何使用的: var cb = $.when(); //when方法也是返回一个延迟对象,源码是return deferred.promise();返回的延迟对象不能修改状 ...
 - jquery源码解析:jQuery队列操作queue方法实现的原理
		
我们先来看一下jQuery中有关队列操作的方法集: 从上图可以看出,既有静态方法,又有实例方法.queue方法,相当于数组中的push操作.dequeue相当于数组的shift操作.举个例子: fun ...
 - jquery源码解析:jQuery静态属性对象support详解
		
jQuery.support是用功能检测的方法来检测浏览器是否支持某些功能.针对jQuery内部使用. 我们先来看一些源码: jQuery.support = (function( support ) ...
 - jquery源码解析:jQuery工具方法Callbacks详解
		
我们首先来讲下Callbacks是如何使用的:第一个例子 function a(){} function b(){} var cb = $.Callbacks(); cb.add(a); cb.add ...
 - jquery源码解析:jQuery延迟对象Deferred(工具方法)详解2
		
请接着上一课继续看. $.Deferred()方法中,有两个对象,一个是deferred对象,一个是promise对象. promise对象有以下几个方法:state,always,then,prom ...
 - jquery源码解析:jQuery延迟对象Deferred(工具方法)详解1
		
请先看上一课的回调对象.Deferred是通过extend添加到jQuery中的工具方法.如下所示: jQuery.extend({ Deferred: function( func ) { }, w ...
 - 四.jQuery源码解析之jQuery.fn.init()的参数解析
		
从return new jQuery.fn.init( selector, context, rootjQuery )中可以看出 参数selector和context是来自我们在调用jQuery方法时 ...
 
随机推荐
- install ros-indigo-map-server
			
sudo apt-get install ros-indigo-map-server
 - mongodb 用户点赞功能理论实现[转载]
			
在 posts(文章) 集合中储存对该文章点赞的用户的 _id 的数组,例如: // posts { _id: ObjectID('4e7020cb7cac81af7136236b'), users_ ...
 - IOS-网络(ASIHTTPRequest的使用简介)
			
使用iOS SDK中的HTTP网络请求API,相当的复杂,调用很繁琐,ASIHTTPRequest就是一个对CFNetwork API进行了封装,并且使用起来非常简单的一套API,用Objective ...
 - Jquery倒计时源码分享
			
在静态页添加显示倒计时的容器,并引用下面脚本,代入时间参数即可使用. timeoutDate——到期时间,时间格式为2014/01/01或2014/1/1 D——天 H——小时 M——分钟 S——秒 ...
 - C语言----------链表的简单实现与操作
			
链表是一种物理存储单元上非连续.非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的. 链表由一系列结点(链表中每一个元素称为结点)组成,结点可以在运行时动态生成. 每个结点包括两个部 ...
 - 用halcon提取衣服徽章
			
收到一封email,有个学员求助去除衣服上纹理的干扰,然后提取衣服上徽章的边缘的方法. 我想他肯定是个很努力上进的boy,在求助以前也许已经试过各种方法,通过二值化不断的调试阈值, 寻找各种边 ...
 - 毒害一代Java程序猿的HttpClient
			
前言 2016年以来,越来越多Android开发者使用Retrofit作为HTTP请求框架.原因其一,Google发布Android 6.0 SDK (API 23) 抛弃了HttpClient:其二 ...
 - 201621123005《Java程序设计》第十二次作业
			
<Java程序设计>第十二次作业 1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多流与文件相关内容. 2. 面向系统综合设计-图书馆管理系统或购物车 使用流与文件改造 ...
 - python中实现上下文管理器的两种方法
			
上下文管理器: python中实现了__enter__和__exit__方法的对象就可以称之为上下文管理器 实现方法一举例: def File(object): def __init__(self, ...
 - web 开发 css 默认值列表
			
css默认值列表 HTML标签CSS属性默认值汇总 这个东西,在你需要还原默认值的时候,比较有用. 开始的时候 *{margin:0;padding:0;},当需要使用边距的时候,就需要还原HTML默 ...