jquery源码学习笔记二:jQuery工厂

jquery源码学习笔记一:总体结构

上两篇说过,query的核心是一个jQuery工厂。其代码如下

function( window, noGlobal ) {

    var jQuery = function( selector, context ) {//首先定义一个内部jQuery。注意,此jQuery只是一个工厂内部的变量,并非我们在外面引用的那个jQuery或$
return new jQuery.fn.init( selector, context );
}; /*然后,对这个内部jQuery对象进行各种增强、扩展*/
jQuery.fn = jQuery.prototype = {
//...
};
jQuery.extend = jQuery.fn.extend = function() {
//...
};
var init = jQuery.fn.init = function( selector, context, root ) {
//...
};
init.prototype = jQuery.fn;
jQuery.extend({
//...
});
jQuery.fn.extend({
//...
}); if ( !noGlobal ) {//最后,将内部jQuery赋给了外部,即我们所熟知的那个“$”
window.jQuery = window.$ = jQuery;
} return jQuery;
}

其实目前来讲,最难理解的就是这个:

var jQuery = function( selector, context ) {
return new jQuery.fn.init( selector, context );
};

感觉怎么将孙子赋给了爷爷?究竟是先有鸡还是先有蛋的问题?

其实呢,应该是这么看:

//只是先定义了一个函数而已,还没有执行,无所谓先有鸡还是先有蛋
var jQuery = function( selector, context ) {
……
};

好吧,第二点疑惑,为啥要new jQuery.fn.init( selector, context );这么个实例赋给jQuery?

是因为,new给jQuery,这样调用jQuery的时候,就不用再new了,简洁一点。

function( window, noGlobal ) {

    var jQuery = function( selector, context ) {
return new jQuery.fn.init( selector, context );
}; …… if ( !noGlobal ) {
window.jQuery = window.$ = jQuery;
} return jQuery;
}

由上代码可知,jQuery 已经是一个 new 出来的对象。如此,我们在使用jQuery的时候,就没有new这一步了,直接就是$.或者$(““)这样来使用。

往下看,有:

jQuery.fn = jQuery.prototype = {
//...
};

为啥这样写呢?有什么玄妙?或者纯粹就是为了装逼?还真是,将原型prototype赋给fn,就是一种简写,不用写成”prototype”这么长。

第四个疑惑:

    jQuery.fn = jQuery.prototype = {
//...
};
jQuery.extend = jQuery.fn.extend = function() {
//...
};
jQuery.extend({
//...
});
jQuery.fn.extend({
//...
});

jQuery.extend和jQuery.fn.extend有啥不一样?

当然不一样了。jQuery.extend扩展(顾名思义)的是实例,而jQuery.fn.extend扩展的是原型。扩展实例,作用仅限于实例;扩展原型,却可以惠及所有实例。扩展原型,可以节省内存。慢着,jQuery不是只有一个实例吗?

不是的,

var jQuery = function( selector, context ) {
return new jQuery.fn.init( selector, context );
};

jQuery随同参数不同,是有许多个实例的。比如,$(“div”) 和 $(“#div1”)是两个不同的实例。

疑惑五:

    var init = jQuery.fn.init = function( selector, context, root ) {
//...
};
init.prototype = jQuery.fn;

为什么要把jQuery的原型(jQuery.fn)覆盖它孙子(jQuery.fn.init)的原型?

答曰,因为不这么写的话,jQuery将用不上jQuery.fn,一系列的原型扩展:jQuery.fn.extend()都白费了。为啥呢,因为

var jQuery = function( selector, context ) {
return new jQuery.fn.init( selector, context );
};

意味着当这个函数真正被执行以后,jQuery将被它孙子的实例所替换,所以必须在定义阶段,就要将扩展应用到孙子的原型中。那么,为啥不直接扩展孙子的原型呢,非要扩展爷爷的原型,然后覆盖孙子的原型,再然后构造孙子实例赋给爷爷?真他妈绕啊。搞来搞去,可能就是为了简洁,和显得有点可读性吧?你看,孙子的名字叫做init。

jquery源码学习笔记三:jQuery工厂剖析的更多相关文章

  1. jquery 源码学习(三)

    jQuery源码分析-03构造jQuery对象-源码结构和核心函数,需要的朋友可以参考下.   作者:nuysoft/高云 QQ:47214707 EMail:nuysoft@gmail.com 毕竟 ...

  2. jquery源码学习笔记二:jQuery工厂

    笔记一里记录,jQuery的总体结构如下: (function( global, factory ) { //调用factory(工厂)生成jQuery实例 factory( global ); }( ...

  3. 菜鸟的jQuery源码学习笔记(前言)

    前言 相信任何一名前端开发人员或者是前端爱好者都对jQuery不陌生.jQuery简单易用,功能强大,特别是拥有良好的浏览器兼容性,大大降低了前端开发的难度,使得前端开发变得“平易近人起来”.自从本人 ...

  4. jquery源码学习笔记(一)jQuery的无new构建

    本人是一名.net程序员..... 你一个.net coder 看什么jQuery 源码啊? 原因吗,很简单.技多不压身吗(麻蛋,前端工作好高...羡慕). 我一直都很喜欢JavaScript,废话不 ...

  5. jQuery源码学习笔记一

    学习jQuery源码,我主要是通过妙味视频上学习的.这里将所有的源码分析,还有一些自己弄懂过程中的方法及示例整理出来,供大家参考. 我用的jquery v2.0.3版本. var rootjQuery ...

  6. jquery源码学习笔记一:总体结构

    练武不练功,到老一场空.计算机也一样. 计算机的功,就是原理.如果程序员只会使用各种函数,各种框架,而不知其原理,顶多熟练工人而已.知其然,更要知其所以然. jquery我们用得很爽,但它究竟咋实现的 ...

  7. jQuery源码学习笔记二

    //添加实例属性和方法 jQuery.fn = jQuery.prototype = { // 版本,使用方式:$().jquery弹出当前引入的jquery的版本 jquery: core_vers ...

  8. jQuery 源码学习笔记

    //检测 window 中新增的对象 //first var oldMap = {}; for(var i in window) { oldMap[i] = 1; } //second for(var ...

  9. 菜鸟的jQuery源码学习笔记(二)

    jQuery对象是使用构造函数和原型模式相结合的方式创建的.现在来看看jQuery的原型对象jQuery.prototype: jQuery.fn = jQuery.prototype = { //成 ...

随机推荐

  1. Python爬虫-代理池-爬取代理入库并测试代理可用性

    目的:建立自己的代理池.可以添加新的代理网站爬虫,可以测试代理对某一网址的适用性,可以提供获取代理的 API. 整个流程:爬取代理 ----> 将代理存入数据库并设置分数 ----> 从数 ...

  2. LeetCode(74) Search a 2D Matrix

    题目 Write an efficient algorithm that searches for a value in an m x n matrix. This matrix has the fo ...

  3. Saving James Bond - Hard Version

    07-图5 Saving James Bond - Hard Version(30 分) This time let us consider the situation in the movie &q ...

  4. 自定义UDF函数应用异常

    自定义UDF函数应用异常 版权声明:本文为yunshuxueyuan原创文章.如需转载请标明出处: http://www.cnblogs.com/sxt-zkys/QQ技术交流群:299142667 ...

  5. Vim增强工具设置

    Vim增强工具设置操作准备:vim ~/.vimrc11. 缩进 & 制表符使 Vim 在创建新行的时候使用与上一行同样的缩进: set autoindent 2. 设置文件里的制表符 (TA ...

  6. [luoguP1227] [JSOI2008]完美的对称(sort)

    传送门 排序! #include <cstdio> #include <iostream> #include <algorithm> #define N 20001 ...

  7. UltraEdit-14.10.0.1024版本语法着色配置

    用了UltraEdit有段时间了,一直没做语法着色,当做普通文本编辑器使用,这也太委屈这个“神器”了. 今天就让它物尽其用吧.体验一把UltraEdit的语法高亮功能. 参考:http://www.1 ...

  8. 2017"百度之星"程序设计大赛 - 初赛(A)数据分割

    n<=100000条相等/不等关系描述<=100000个数,把这些数据分割成若干段使得每一段描述都出现冲突且冲突只出现在最后一行. 相等关系具有传递性,并查集维护:不等关系根据相等关系进行 ...

  9. poj2243+poj1915骑士问题

    2243是骑士问题,八个格子的,BFS,因为要最短路经,所以没有用A*,A*跑不出来,太慢了,因为要搜索到所有解啊!一直更新最优,而BFS,一层一层搜索,第一次得到的便是最短的了!300格子,标记的话 ...

  10. P2820 局域网 洛谷

    https://www.luogu.org/problem/show?pid=2820 题目背景 某个局域网内有n(n<=100)台计算机,由于搭建局域网时工作人员的疏忽,现在局域网内的连接形成 ...