第二章 构造jQuery对象

jQuery对象是一个类数组对象,含有连续的整型属性、length属性和大量的jQuery方法,$()是jQuery()的缩写

构造函数jQuery()

如果调用构造函数jQuery()时传入的参数不同,创建的jQuery对象的逻辑也会随之不同

jQuery(selector[,context]):

如果传入一个字符串参数,jQuery会检查这个字符串是选择器表达式还是HTML代码。如果是选择器表达式,则遍历文档,查找与之匹配的DOM元素,并创建一个包含了这些DOM元素引用的jQuery对象;如果没有元素与之匹配,则创建一个空jQuery对象,其中不包含任何元素,其属性length等于0;

默认情况下,对匹配元素的查找将从根元素document对象开始,也可以传入第二个参数context(上下文)来限定查找范围

$('div.foo').click(function(){

  $('span',this).addClass('bar');  //限定查找范围,等价于$('this').find('span')

});

jQuery(html[,ownerDocument])、jQuery(html,props):

如果传入的字符串是一段HTML代码,jQuery则尝试用这段HTML代码创建新的DOM元素,并创建一个包含了这些DOM元素引用的jQuery对象

$('<p id="test">My<em>text</em></p>').appendTo('body');

第二个参数ownerDocument用于指定创建DOM元素的文档对象,如不传入,默认当前文档对象;

如果HTML代码是一个单独的标签,那么第二个参数还可以是props,props是一个包含了属性、事件的普通对象;在调用document.createElement()创建DOM元素后,参数props会被传给jQuery方法.attr(),由attr()负责把参数props中得属性、事件设置到新创建的DOM元素上

参数 props 可以含有以下特殊属性:val、css、
html、text、data、width、height、offset,相应的 jQuery 方 法:.val()、.css()、.html()、.text()、.
data()、.width()、.height()、.offset() 将被执行,并且属性值会作为参数传入

$("<div/>",{

"class":"test",  //class是JavaScript保留字

text:"Click me!"

click:function(){

  $(this).toggleClass("test");

}

}).appendTo("body");

jQuery(element)、jQuery(elementArray):

如果传入一个 DOM 元素或 DOM元素数组,则把 DOM 元素封装到 jQuery 对象中并返回,

这个功能常见于事件监听函数,即把关键字 this 引用的 DOM 元素封装为 jQuery 对象,
然后在该 jQuery 对象上调用 jQuery 方法。

$('div .foo').click(function(){

  $(this).slideUp();

});

jQuery(object):

如果传入一个普通 JavaScript 对象,则把该对象封装到 jQuery 对象中并返回,可以为这个封装后的对象添加方法属性

jQuery(callback):

如果传入一个函数,则在 document 上绑定一个 ready 事件监听函数,当 DOM 结构加载
完成时执行,ready 事件的触发要早于 load 事件

jQuery(jQuery object):

如果传入一个 jQuery 对象,则创建该 jQuery 对象的一个副本并返回,副本与传入的
jQuery 对象引用完全相同的 DOM 元素

jQuery():

如果不传入任何参数,则返回一个空的 jQuery 对象,属性 length 为 0

第 25 行又定义了一个变量 jQuery,它的值是 jQuery 构造函数

第 97 ~ 319 行覆盖了构造函数 jQuery() 的原型对象

第 98 行覆盖了原型对象的属性 constructor,使它指向 jQuery 构造函数

第 99 行定义了原型方法 jQuery.fn.init(),它负责 解析参数 selector 和 context 的类型并执行相应的查找

1)为什么要在构造函数 jQuery() 内部用运算符 new 创建并返回另一个构造函数的实例?

例如, newDate() 会返回一个 Date 对象;但是,如果构造函数有返回值,运算符 new 所创建的对象 会被丢弃,返回值将作为 new 表达式的值。

通过在构造函数 jQuery() 内部用运算符 new 创建并返回另一个 构造函数的实例,省去了构造函数 jQuery() 前面的运算符 new,即我们创建 jQuery 对象时, 可以省略运算符 new 直接写 jQuery()

2)为什么在第 97 行执行 jQuery.fn = jQuery.prototype,设置 jQuery.fn 指向构造函数 jQuery() 的原型对象 jQuery.prototype ?

jQuery.fn 是 jQuery.prototype 的简写,可以少写 7 个字符,以方便拼写。

3)既然调用构造函数 jQuery() 返回的 jQuery 对象实际上是构造函数 jQuery.fn.init() 的
实例,为什么能在构造函数 jQuery.fn.init() 的实例上调用构造函数 jQuery() 的原型方法和属
性?例如,$('#id').length 和 $('#id').size()。

在第 322 行执行 jQuery.fn.init.prototype = jQuery.fn 时,用构造函数 jQuery() 的原型对象
覆盖了构造函数 jQuery.fn.init() 的原型对象,从而使构造函数 jQuery.fn.init() 的实例也可以访
问构造函数 jQuery() 的原型方法和属性

4)为什么要把第 25 ~ 955 行的代码包裹在一个自调用匿名函数中,然后把第 25 行定
义的构造函数 jQuery() 作为返回值赋值给第 22 行的 jQuery 变量?去掉这个自调用匿名函
数,直接在第 25 行定义构造函数 jQuery() 不也可以吗?去掉了不是更容易阅读和理解吗?

去掉第 25 ~ 955 行的自调用匿名函数当然可以,但会潜在地增加构造 jQuery 对象模块
与其他模块的耦合度。在第 25 ~ 97 行之间还定义了很多其他的局部变量,这些局部变量只
在构造 jQuery 对象模块内部使用。通过把这些局部变量包裹在一个自调用匿名函数中,实现
了高内聚低耦合的设计思想

为什么要覆盖构造函数 jQuery() 的原型对象 jQuery.prototype ?

在原型对象 jQuery.prototype 上定义的属性和方法会被所有 jQuery 对象继承,可以有
效减少每个 jQuery 对象所需的内存

jQuery技术内幕预览版.pdf2的更多相关文章

  1. jQuery技术内幕预览版.pdf3

    jQuery.fn.init(selector,context,rootjQuery):构造函数 jQuery.fn.init() 负责解析参数 selector 和 context 的类型,并执行相 ...

  2. jQuery技术内幕预览版.pdf1

    第一章 总体构架 jQuery模块可以分为3部分:入口模块.底层支持模块和功能模块 浏览器功能测试模块提供了针对不同浏览器功能和bug的测试结果,其它模块基于测试结果解决浏览器之间的兼容性问题 回调函 ...

  3. Windows 10 技术预览版9926 “未知源”引起系统休眠后自启的解决办法

    问题的由来: 自从安装上了最新发布的Windows 10 ,使用起来有诸多的改进:无论是重绘的图标还是通知消息中心的整合还是更智能的OneDrive客户端都使得工作起来非常愉悦. 不过笔者这两天频繁遇 ...

  4. 微软推出首个Microsoft Azure Stack技术预览版

    Mike Neil,微软公司企业云副总裁 怀着对于提高业务灵活性.加速创新的期待,很多企业正在向云平台迅速迁移.伴随着这样的趋势,我们也见证了微软智能云Azure业务在全球市场的快速增长--每个月近1 ...

  5. 熊猫猪新系统测试之一:Windows 10 技术预览版

    话说本猫不用windows很多年了呀!不过看到微软最新的Windows10还是手痒了,想安装体验一把.于是第一时间下载,并做成usb引导安装镜像,在08年的老台式机上安装尝鲜鸟.下载ISO和安装方法这 ...

  6. 微软发布Azure Stack第一个技术预览版

    为了提升商业灵敏度和加快创新步伐,各个企业都在迅速地转向云服务.在微软,我们已经见到微软智能云Azure的飞速发展和使用,每月我们都有近十万的新增订阅量.然而,我们也了解到还有很多企业在完全移到公有云 ...

  7. 熊猫猪新系统測试之中的一个:Windows 10 技术预览版

    话说本猫不用windows非常多年了呀! 只是看到微软最新的Windows10还是手痒了.想安装体验一把. 于是第一时间下载,并做成usb引导安装镜像,在08年的老台式机上安装尝鲜鸟.下载ISO和安装 ...

  8. 【官方免费】Apple Silicon M1 + Parallels 16技术预览版 + Win 10 arm64

    期待了好久,终于能用pd运行win10了,其实也就想写个c++,mac上配置个c++编译器太麻烦了.. 步骤: 打开 https://my.parallels.com/desktop/beta,这里下 ...

  9. 获取WIN10技术预览版

    说明 这是一款预发行软件 在进行商业发行之前,我们可能会对 Windows Technical Preview 进行大量修改. Microsoft 不对此处提供的信息作任何明示或默示的担保. 有些产品 ...

随机推荐

  1. C++类继承内存布局(一)

    转自:http://blog.csdn.net/jiangyi711/article/details/4890889# 一 类布局 不同的继承方式将导致不同的内存布局 1)C结构 C++基于C,所以C ...

  2. Essential C++ 学习笔记01--基本语法

    <Essential C++>1.1-1.4节笔记 1. main 函数 main 函数是代码的入口,若无 main 函数,编译不通过. main 函数通常声明为 int, return ...

  3. gitlab的安装以及汉化

    gitlab的安装 首先在网上下载好任意版本gitlab的rpm包 推荐下面的地址: https://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum/el7/gi ...

  4. JQuery上传插件Uploadify

    一:官网 http://www.uploadify.com/ 二:引用 <link href="plug-in/uploadify3.2.1/uploadify.css" r ...

  5. linux重新增加硬盘容量

    1.先用df -h查看硬盘使用情况 2.fdisk -l查看分区情况 表示还没有挂载 3.fdisk /dev/vdb进行分区 4.mkfs.ext3 /dev/vdb进行格式化 5.mount /d ...

  6. linux线程(一)基本应用

    有感而发(可以直接忽略~):每次要用到线程,都要在网上重新学下基础,例子倒是不少:一种是排版好,讲的不全又不是自己想要的:一种是排版不好,直接略过了.两者兼有的又要苦苦寻找,所以还是自己总结了,觉得每 ...

  7. jquery 判断是否 ie6 ie7 ie8

      var isIE = !!window.ActiveXObject; var isIE6 = isIE && !window.XMLHttpRequest; var isIE8 = ...

  8. 使用HttpClient向服务器发送restful post请求

    直接上代码: public class RestClient { public static void main(String[] args) { String url = "http:// ...

  9. [wikioi]奇怪的梦境

    http://wikioi.com/problem/2833/ 拓扑排序,居然1A,哈哈. #include <cstdio> #include <iostream> #inc ...

  10. 任正非:华为三十年大限快到了 想不死就得新生(建立战略预备队)cool

    华为心声社区官方微信今日发布了任正非8月15日在华为公司内部做的关于战略预备队建设汇报的讲话.讲话内容中提到,华为公司需要组织.结构.人才等所有一切都变化,通过变化使新的东西成长起来.   任正非表示 ...