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工厂剖析的更多相关文章
- jquery 源码学习(三)
jQuery源码分析-03构造jQuery对象-源码结构和核心函数,需要的朋友可以参考下. 作者:nuysoft/高云 QQ:47214707 EMail:nuysoft@gmail.com 毕竟 ...
- jquery源码学习笔记二:jQuery工厂
笔记一里记录,jQuery的总体结构如下: (function( global, factory ) { //调用factory(工厂)生成jQuery实例 factory( global ); }( ...
- 菜鸟的jQuery源码学习笔记(前言)
前言 相信任何一名前端开发人员或者是前端爱好者都对jQuery不陌生.jQuery简单易用,功能强大,特别是拥有良好的浏览器兼容性,大大降低了前端开发的难度,使得前端开发变得“平易近人起来”.自从本人 ...
- jquery源码学习笔记(一)jQuery的无new构建
本人是一名.net程序员..... 你一个.net coder 看什么jQuery 源码啊? 原因吗,很简单.技多不压身吗(麻蛋,前端工作好高...羡慕). 我一直都很喜欢JavaScript,废话不 ...
- jQuery源码学习笔记一
学习jQuery源码,我主要是通过妙味视频上学习的.这里将所有的源码分析,还有一些自己弄懂过程中的方法及示例整理出来,供大家参考. 我用的jquery v2.0.3版本. var rootjQuery ...
- jquery源码学习笔记一:总体结构
练武不练功,到老一场空.计算机也一样. 计算机的功,就是原理.如果程序员只会使用各种函数,各种框架,而不知其原理,顶多熟练工人而已.知其然,更要知其所以然. jquery我们用得很爽,但它究竟咋实现的 ...
- jQuery源码学习笔记二
//添加实例属性和方法 jQuery.fn = jQuery.prototype = { // 版本,使用方式:$().jquery弹出当前引入的jquery的版本 jquery: core_vers ...
- jQuery 源码学习笔记
//检测 window 中新增的对象 //first var oldMap = {}; for(var i in window) { oldMap[i] = 1; } //second for(var ...
- 菜鸟的jQuery源码学习笔记(二)
jQuery对象是使用构造函数和原型模式相结合的方式创建的.现在来看看jQuery的原型对象jQuery.prototype: jQuery.fn = jQuery.prototype = { //成 ...
随机推荐
- markdown pad激活
<iframe src="></iframe> ---恢复内容开始--- 注册码 Soar360@live.com GBPduHjWfJU1mZqcPM3BikjYK ...
- tiny4412u-boot烧写及根文件系统制作(不进入终端问题)
http://m.blog.csdn.net/article/details?id=51400196(转) VMware12 环境:ubuntu12.4 开发板:tiny4412 首先烧写bootlo ...
- while循环处理列表和字典
一.在列表之间移动元素 假设有一个列表,里面存放的是网站新注册但没有验证的用户,验证这些用户后,如何将它们移动到另一个已验证用户列表中呢? 其中一种方法是使用while循环,在验证用户的同时,将其从未 ...
- 【HIHOCODER 1526】 序列的值(二进制DP)
时间限制:20000ms 单点时限:1000ms 内存限制:256MB 描述 给定一个长度为 n 的序列 a[1..n],定义函数 f(b[1..m]) 的值为在 [0,m-1] 内满足如下条件的 i ...
- 关于markdown 的简单使用(已更新)
markdown的介绍 Markdown是一种可以使用普通文本编辑器编写的标记语言,通过类似HTML的标记语法,它可以使普通文本内容具有一定的格式. Markdown具有一系列衍生版本,用于扩展Mar ...
- Jquery 1.6+ .prop()与.attr()方法比较
http://www.cnblogs.com/lujiahong/articles/2289867.html 今天在用JQuery的时候发现一个问题用.attr("checked" ...
- Poj3253:Fence Repair 【贪心 堆】
题目大意:背景大概是个资本家剥削工人剩余价值的故事....有一块木板,要把它切成几个长度,切一次的费用是这整块被切木板的长度,例如将一个长度为21的木板切成2和19两块费用为21,切成两块的长度及顺序 ...
- C#.net中当地址有中文时,图片无法显示解决方法
原文发布时间为:2008-11-05 -- 来源于本人的百度文章 [由搬家工具导入] 搞了半天都无法正常显示图片, string path = Server.MapPath("." ...
- js闭包的用途[转载]
通过使用闭包,我们可以做很多事情.比如模拟面向对象的代码风格:更优雅,更简洁的表达出代码:在某些方面提升代码的执行效率. 1 匿名自执行函数我们知道所有的变量,如果不加上var关键字,则默认的会添加到 ...
- Codechef May Challenge 2015
随便瞎写,其实没做出多少题: Chef and Cake 题目大概是用输入的数生成 一个数组并且生成出q个[X,Y]的询问, 数组长度N<=1000000,q<=10^7; 开始用线段树, ...