//源码剖析都基于jQuery-2.0.3版本,主要考虑到兼容IE

一、关于jQuery对象实例化的逻辑:

整个jQuery程序被包裹在一个匿名自执行行数内:

 (function(window,undefined){
//......
})(window);

外部程序不能直接调用jQuery对象的属性和方法,jQuery所有方法和属性被变成局部私有的。例如:

 (function(window,undefined){
var a = "我是a";
var b = function(a){
alert("我是b");
}
})(window);
console.log(a);
//报错:a is not defined(a未定义)
b();
//报错:b is not defined(b未定义)

既然所有方法和属性都是私有的,就存在一个问题,如何使用jQuery对象和对象的方法和属性呢?

这就产生了jQuery的接口$:(8825~8827行)

if ( typeof window === "object" && typeof window.document === "object" ) {
window.jQuery = window.$ = jQuery;
}

这个逻辑处理了jQuery的对外接口,将自身赋给window对象下的$属性,同时还赋给了window对象下的jQuery属性,这样在全局下(window对象)就有了两个属性可以调取jQuery,分别是$和jQuery;

然后jQuery又是通过一个构造方法实现的(61~64行)

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

通过上面的源码可以看到,jQuery是将两个参数selector,context传入一个init()方法(init()方法会返回一个对象);

init立即执行获后获得的就是一个jQuery对象初始化对象。   193行 //return jQuery.makeArray( selector, this );

//通常的jQuery对象初始化
$(fuction(){
//通过jQuery实现的具体业务逻辑
});

暂且不说写入自己的这个匿名方法参数的原理,$()就等于实现了jQuery(),也同等于init()执行并返回对象,这个对象就是jQuery对象的实例化。

还记得在jQuery通过window的自身扩展的$属性和jQuery属性来实现jQuery的接口,也就是说,jQuery实例化的方法还可以写成:

//通常的jQuery对象初始化
jQuery(fuction(){
//通过jQuery实现的具体业务逻辑
});

以上就是jQuery对象实初始化的全部过程和内容,接下来正式进入jQuery原型的构建原理和extend内部扩展方法说明的内容:

继续剖析jQuery原型的构建原理:

从上面对象实例化的jQuery的过程可以知道,jQuery的对象原型是通过init()方法构造的,然而下面一段代码一定会让很多人疑惑(96~279行)。

jQuery.fn = jQuery.prototype = {......}

前面的构造逻辑已经表明了,jQuery对象是通过init()方法构造的,

那么jQuery的原型应该就是基于init构造方法的,为什么还要在这里写jQuery的原型呢?

所以往后看,源码283行有如下代码:

jQuery.fn.init.prototype = jQuery.fn;

这行代码就是将前面写的jQuery原型赋给了init的原型,

所以,jQuery通过init()构造实例对象,最后还是基于自身的原型构造的。最终的原型链指向的还是jQuery.proptotype;

在源码96行可以看到,jQuery的原型是一个自定义的对象(前面有提到);

jQuery.fn = jQuery.prototype = {......}

所以在源码的100行有这样的代码,重新将构造方法指向了jQuery,实现了jQuery的构造逻辑。

constructor: jQuery,

二、jQuery构建模型分析图

三、jQuery构建逻辑的实现过程(仿写jQuery)

1.创建一个闭包环境

jQuery源码解析对象实例化与jQuery原型及整体构建模型分析(一)的更多相关文章

  1. JQuery源码解析-- 对象的创建

    使用 $("a") 返回的对象就不再是一个简单的DOM对象了,而是一个复杂的JQuery对象. 那么JQuery是怎么创建对象的. 为了便于分析,我将JQuery中复杂的代码简化了 ...

  2. jQuery 源码解析二:jQuery.fn.extend=jQuery.extend 方法探究

    终于动笔开始 jQuery 源码解析第二篇,写文章还真是有难度,要把自已懂的表述清楚,要让别人听懂真的不是一见易事. 在 jQuery 源码解析一:jQuery 类库整体架构设计解析 一文,大致描述了 ...

  3. jquery源码解析:代码结构分析

    本系列是针对jquery2.0.3版本进行的讲解.此版本不支持IE8及以下版本. (function(){ (21, 94)     定义了一些变量和函数,   jQuery = function() ...

  4. JQuery源码解析(一)

    写在前面:本<JQuery源码解析>系列是基于一些前辈们的文章进行进一步的分析.细化.修改而写出来的,在这边感谢那些慷慨提供科普文档的技术大拿们. 要查阅JQ的源文件请下载开发版的JQ.j ...

  5. jquery源码中noConflict(防止$和jQuery的命名冲突)的实现原理

    jquery源码中noConflict(防止$和jQuery的命名冲突)的实现原理 最近在看jquery源码分析的视频教学,希望将视频中学到的知识用博客记录下来,更希望对有同样对jquery源码有困惑 ...

  6. jquery源码学习笔记三:jQuery工厂剖析

    jquery源码学习笔记二:jQuery工厂 jquery源码学习笔记一:总体结构 上两篇说过,query的核心是一个jQuery工厂.其代码如下 function( window, noGlobal ...

  7. JQuery源码之“对象的结构解析”

    吃完午饭,觉得有点发困,想起了以后我们的产品可能要做到各种浏览器的兼容于是乎不得不清醒起来!我们的web项目多数是依赖于Jquery的.据了解,在Jquery的2.0版本以后对IE的低端版本浏览器不再 ...

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

    这张图片是对jQuery源码截图,一点一点拼出来的. 现在根据这张图片来对jQuery框架做一些说明. 一.16~9404行可以发现,最外层是一个自调用函数.当jQuery初始化时,这个自调用函数包含 ...

  9. jquery源码解析:jQuery数据缓存机制详解1

    jQuery中有三种添加数据的方法,$().attr(),$().prop(),$().data().但是前面两种是用来在元素上添加属性值的,只适合少量的数据,比如:title,class,name等 ...

随机推荐

  1. 用二分法定义平方根函数(Bisection method Square Root Python)

    Python里面有内置(Built-in)的平方根函数:sqrt(),可以方便计算正数的平方根.那么,如果要自己定义一个sqrt函数,该怎么解决呢? 解决思路:  1. 大于等于1的正数n的方根,范围 ...

  2. 【BZOJ3236】【AHOI2013】作业 线段树 分治 树状数组

    题目描述 给你一个长度为\(n\)的数列,还有\(m\)个询问,对于每个询问\((l,r,a,b)\),输出1.区间\([l,r]\)有多少范围在\([a,b]\)的数:2.区间\([l,r]\)有多 ...

  3. flask简单登录注册

    效果图 发布问答页面需要登录才能访问,没有登录会跳转到登录页面 模板继承,正则验证,数据库迁移,md5加密 mysql 5.7 登录页面 登录后的发布问答页面,右上角会显示用户名和注销 项目代码:码云

  4. MT【266】求$a$的范围

    已知 $a$ 为常数,函数$f(x)=\dfrac{x}{\sqrt{a-x^2}-\sqrt{1-x^2}}$ 的最小值为$-\dfrac{2}{3}$,则 $a$ 的取值范围_____ 解: 考虑 ...

  5. 【BZOJ4316】小C的独立集(动态规划)

    [BZOJ4316]小C的独立集(动态规划) 题面 BZOJ 题解 考虑树的独立集求法 设\(f[i][0/1]\)表示\(i\)这个点一定不选,以及\(i\)这个点无所谓的最大值 转移\(f[u][ ...

  6. 【BZOJ5302】[HAOI2018]奇怪的背包(动态规划,容斥原理)

    [BZOJ5302][HAOI2018]奇怪的背包(动态规划,容斥原理) 题面 BZOJ 洛谷 题解 为啥泥萌做法和我都不一样啊 一个重量为\(V_i\)的物品,可以放出所有\(gcd(V_i,P)\ ...

  7. luogu2282/bzoj1219 历史年份 (dp+hash+二分+线段树)

    luogu1415 拆分数列的加强版 先考虑弱化版怎么做 设f[i]表示某一串数,最后一个数的右端点是i时,它的左端点的最大值(也就是说,这一串数的最后一个数尽量小) 那么有$f[j]=max\{i+ ...

  8. 纪中2018暑假培训day7提高b组改题记录

    由于今天太颓了,所以没有解释 t1: Description 码零鼠是一只很喜欢mx数学的神犇,上面那个不是ta本人的样子.这天,ta在研究一个神奇的数列,这个数列是这样的:a0 = 1an = ai ...

  9. poj 3258"River Hopscotch"(二分搜索+最大化最小值问题)

    传送门 https://www.cnblogs.com/violet-acmer/p/9793209.html 题意: 有 N 块岩石,从中去掉任意 M 块后,求相邻两块岩石最小距离最大是多少? 题解 ...

  10. Educational Codeforces Round 55 (Rated for Div. 2) A - Vasya and Book

    传送门 https://www.cnblogs.com/violet-acmer/p/10035971.html 题意: 一本书有n页,每次只能翻 d 页,问从x页到y页需要翻动几次? 注意:往前翻最 ...