第二章 构造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. PHP——图片上传

    图片上传 Index.php文件代码: <!DOCTYPE html> <html lang="en"> <head> <meta cha ...

  2. mini2440移植uboot-2008.10 (二) DM9000网卡驱动移植

    还是利用 mini2440移植uboot-2008.10 (一)  修改好的代码 通过观察可以发现,mini2400使用的网卡芯片是DM9000,在uboot-2008.10源码中已经支持该芯片的驱动 ...

  3. js之封装sort实现json格式数据的排序

    eg  : data:{[ {"name":"paul","ege":12}, {"name":"paul&q ...

  4. jQuery 滚动动画简单版

    动画的思路很简单,点击页面上一个元素,页面滚动到指定位置.下面介绍一下我3个小时百度的研究成果: 首先是html部分: <html> <body> <a>顶部< ...

  5. 【转】EXT JS MVC开发模式

    原文链接:EXT JS MVC开发模式 在app(亦即根目录)文件夹下面创建controller.model.store和view文件夹,从名称上就知道他们该放置什么代码了吧.然后创建Applicat ...

  6. 用vld分析C++内存泄漏

    最近发现项目里有内存泄漏,到网上搜了一些资料,决定用vld来分析解决这个问题. 直接在vs里的"工具和扩展"中搜索vld,然后下载安装就可以了. 我下载下来的是个exe文件,安装在 ...

  7. nRF52系列——nRF52832来袭

    nRF52系列——nRF52832来袭 Nordic凭借着在无线技术的数十年深耕,推出第一个μBlue芯片-- nRF8001.其低功耗等特性在当时吸引了无数厂商的目光,并将这产品应用到多个领域,再之 ...

  8. 大话设计模式(带目录完整版).pdf等

    点击进入百度网盘 大话设计模式(带目录完整版).pdf等 保存至网盘下载二维码举报 赞(0)| 评论 | 分享至 分享时间:2014-04-01 11:02 | 467次浏览 130次下载 81次保存 ...

  9. source insight添加汇编文件.s

    (1) 做ARM嵌入式开发时,有时得整汇编代码,但在SIS里建立PROJECT并ADD TREE的时候,根据默认设置并不会把该TREE里面所有汇编文件都包含进来,默认只加了.inc和.asm后缀的, ...

  10. 推送 -- error:Not get deviceToken yet

    获取不到devicetoken请检查: 1)     请检查你的pushconfig里的appkey与应用详情中是否一致 2)     bundleid有3处需要检查是否一致:a.你的应用详情中的bu ...