深入理解jQuery()方法的构建原理


Posted in Javascript onDecember 05, 2016

前言

虽然JQuery相对简单,但要全面掌握,且快速灵活的使用它也并不那么容易,它提供了很多方法,包含了网页开发的各个知识面,所以要全面掌握这些知识点,个人认为还是需要对jquery有深入的理解,对这些知识点做分类整理记忆,这样你才能面对一些JQuery代码的时候不会感到迷惑,才会知道采用何种方式实现某个特效是最佳实践,才能快速的采用JQuery来进行项目开发。

jQuery中最常用方法的就是jQuery( ) ,也即$( )

jQuery( )是一个函数调用,调用的结果是返回了一个jQuery实例对象。

编写组件通常的做法是将组件封装成一个对象,需要用的时候则通过new运算符来创建一个实例。但是jQuery( )无须我们用new手工实例化,它会自动返回一个实例。

要实现这一点,最直接的思路就是定义这样一个函数:

深入理解jQuery()方法的构建原理

这么做的问题是出现了死循环:

深入理解jQuery()方法的构建原理

最简单的解决办法是借助另一个构造函数:

深入理解jQuery()方法的构建原理

这么做技术上并没有什么问题,但是jQuery的作者并没有这么做,可能是出于某种技术洁癖或者我暂时不清楚的原因,init被定义在了jQuery函数的原型中:

深入理解jQuery()方法的构建原理

通过init作为中转站,最终return出了一个jQuery实例。看上去更“雅致”,更有“技术范”。

将上述代码写在一个自执行函数内(形成私有作用域,避免命名空间污染),就构成了jQuery的核心框架(简化版):

深入理解jQuery()方法的构建原理

要理解上述结构的工作原理,必须理解JavaScript基于构造函数和原型的继承模式。

当函数调用表达式前出现了关键字new,这个函数就成了构造函数,此时会依次发生四件事:

     1、首先一个空对象(又称实例)被创建出来了。

     2、该空对象继承构造函数的原型中的属性和方法。这也是为什么要把方法都写在构造函数的prototype里。

     3、该空对象被赋值给构造函数内部的this对象。

     4、执行构造函数。如果构造函数中显式的返回了一个对象,那么new出的就不再是新创建的空对象,而是return指定的对象。否则一律返回新建空对象。

具体参见阮一峰教程:http://javascript.ruanyifeng.com/oop/basic.html

于是jQuery( )的构造原理就很清晰了:每次调用jQuery( )都返回由构造函数init指定返回的this对象,而this对象已经被赋值为那个新创建的空对象。由于把jQuery.prototype都赋给了init.prototype,所以新创建的空对象继承所有jQuery的方法。

构造函数init里面的return this其实删掉也无妨,至于作者为啥要加这句,呃,可能是因为知道的太多。

总结

以上就是jQuery()方法构建原理的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流。

Javascript 相关文章推荐
jquery获取被勾选的checked(选中)的那一行的3列和4列的值
Jul 04 Javascript
javascript字母大小写转换的4个函数详解
May 09 Javascript
JS小游戏之宇宙战机源码详解
Sep 25 Javascript
JavaScript闭包实例详解
Jun 03 Javascript
Javascript 数组去重的方法(四种)详解及实例代码
Nov 24 Javascript
BootStrap表单验证 FormValidation 调整反馈图标位置的实例代码
May 17 Javascript
使用JavaScript实现表格编辑器(实例讲解)
Aug 02 Javascript
react-native-fs实现文件下载、文本存储的示例代码
Sep 22 Javascript
Vue按需加载的具体实现
Dec 02 Javascript
webpack 单独打包指定JS文件的方法
Feb 22 Javascript
JavaScript实现与web通信的方法详解
Aug 07 Javascript
jQuery ajax - getScript() 方法和getJSON方法
May 14 jQuery
jQuery控制控件文本的长度的操作方法
Dec 05 #Javascript
浅析Ajax语法
Dec 05 #Javascript
jQuery的事件预绑定
Dec 05 #Javascript
微信小程序 UI布局常用技巧整理总结
Dec 05 #Javascript
深入理解vue.js双向绑定的实现原理
Dec 05 #Javascript
微信小程序 底部导航栏目开发资料
Dec 05 #Javascript
基于js实现的限制文本框只可以输入数字
Dec 05 #Javascript
You might like
smarty模板判断数组为空的方法
2015/06/10 PHP
PHP+jQuery+Ajax实现分页效果 jPaginate插件的应用
2015/10/09 PHP
PHP中获取文件创建日期、修改日期、访问时间的方法
2016/11/05 PHP
PHP实现数组的笛卡尔积运算示例
2017/12/15 PHP
javascript RadioButtonList获取选中值
2009/04/09 Javascript
关于使用 jBox 对话框的提交不能弹出问题解决方法
2012/11/07 Javascript
利用NodeJS的子进程(child_process)调用系统命令的方法分享
2013/06/05 NodeJs
javascript中验证大写字母、数字和中文
2014/01/15 Javascript
使用Node.js实现一个简单的FastCGI服务器实例
2014/06/09 Javascript
基于jQuery插件实现环形图标菜单旋转切换特效
2015/05/15 Javascript
jQuery插件jquery-barcode实现条码打印的方法
2015/11/25 Javascript
js获取鼠标位置实例详解
2015/12/09 Javascript
使用Sticky组件实现带sticky效果的tab导航和滚动导航的方法
2016/03/22 Javascript
jQuery事件绑定on()与弹窗实现代码
2016/04/28 Javascript
深入理解Javascript中的观察者模式
2017/02/20 Javascript
Vue-resource拦截器判断token失效跳转的实例
2017/10/27 Javascript
深入浅析Vue.js中 computed和methods不同机制
2018/03/22 Javascript
js继承的这6种方式!(上)
2019/04/23 Javascript
Vue+elementui 实现复杂表头和动态增加列的二维表格功能
2019/09/23 Javascript
JavaScript中的相等操作符使用详解
2019/12/21 Javascript
[01:07:13]TNC vs Pain 2018国际邀请赛小组赛BO2 第一场 8.17
2018/08/20 DOTA
[01:55]TI9显影之尘系列 - Evil Geniuses
2019/08/22 DOTA
[42:32]完美世界DOTA2联赛PWL S2 LBZS vs FTD.C 第二场 11.27
2020/12/01 DOTA
Python调用SQLPlus来操作和解析Oracle数据库的方法
2016/04/09 Python
详解python eval函数的妙用
2017/11/16 Python
python读取Excel实例详解
2018/08/17 Python
HTML5中的nav标签学习笔记
2016/06/24 HTML / CSS
BannerBuzz加拿大:在线定制横幅印刷、广告和标志
2020/03/10 全球购物
意大利买卖二手奢侈品网站:LAMPOO
2020/06/03 全球购物
如果有两个类A,B,怎么样才能使A在发生一个事件的时候通知B
2016/03/12 面试题
高中生操行评语
2014/04/25 职场文书
党员干部廉洁承诺书
2014/05/28 职场文书
校园安全标语
2014/06/07 职场文书
清明扫墓感想
2015/08/11 职场文书
情感电台广播稿
2015/08/18 职场文书
Vue详细的入门笔记
2021/05/10 Vue.js