深入理解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 相关文章推荐
图片自动更新(说明)
Oct 02 Javascript
javascript 操作cookies及正确使用cookies的属性
Oct 15 Javascript
JAVASCRIPT车架号识别/验证函数代码 汽车车架号验证程序
Jan 08 Javascript
如何实现textarea里的不同文本显示不同颜色
Jan 20 Javascript
jQuery的图片滑块焦点图插件整理推荐
Dec 07 Javascript
js简单设置与使用cookie的方法
Jan 22 Javascript
Angularjs 实现分页功能及示例代码
Sep 14 Javascript
详解webpack 打包文件体积过大解决方案(code splitting)
Apr 10 Javascript
jQuery实现表格隔行换色
Sep 01 jQuery
vue写h5页面的方法总结
Feb 12 Javascript
vue中使用props传值的方法
May 08 Javascript
详解微信小程序「渲染层网络层错误」的解决方法
Jan 06 Javascript
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
用PHP编程语言开发动态WAP页面
2006/10/09 PHP
在PHP中使用curl_init函数的说明
2010/11/02 PHP
PHP移动文件指针ftell()、fseek()、rewind()函数总结
2014/11/18 PHP
laravel5.2实现区分前后台用户登录的方法
2017/01/11 PHP
PHP微信分享开发详解
2017/01/14 PHP
asp批量修改记录的代码
2008/06/25 Javascript
javascript(jquery)利用函数修改全局变量的代码
2009/11/02 Javascript
js中浮点型运算BUG的解决方法说明
2014/01/06 Javascript
解决js下referer兼容各大浏览器的方法
2014/11/03 Javascript
谈谈Jquery中的children find 的区别有哪些
2015/10/19 Javascript
AngularJS 避繁就简的路由
2016/07/01 Javascript
JS实现的多张图片轮流播放幻灯片效果
2016/07/22 Javascript
JavaScript获取服务器时间的方法详解
2016/12/11 Javascript
jQuery实现圣诞节礼物传送(花式轮播)
2016/12/25 Javascript
简单谈谈React中的路由系统
2017/07/25 Javascript
使用vue官方提供的模板vue-cli搭建一个helloWorld案例分析
2018/01/16 Javascript
vue监听浏览器原生返回按钮,进行路由转跳操作
2020/09/09 Javascript
Python库urllib与urllib2主要区别分析
2014/07/13 Python
python如何重载模块实例解析
2018/01/25 Python
Python多进程并发与多线程并发编程实例总结
2018/02/08 Python
推荐10款最受Python开发者欢迎的Python IDE
2018/09/16 Python
Python字典对象实现原理详解
2019/07/01 Python
python实现复制大量文件功能
2019/08/31 Python
基于python的selenium两种文件上传操作实现详解
2019/09/19 Python
Python中输入和输出(打印)数据实例方法
2019/10/13 Python
python在linux环境下安装skimage的示例代码
2020/10/14 Python
jupyter notebook指定启动目录的方法
2021/03/02 Python
法国时尚童装网站:Melijoe
2016/08/10 全球购物
澳大利亚首个在线预订旅游网站:Wotif
2017/07/19 全球购物
100%有机精油,美容油:House of Pure Essence
2018/10/30 全球购物
Belstaff英国官方在线商店:Belstaff.co.uk
2021/02/09 全球购物
瑞士男士时尚网上商店:Babista
2020/05/14 全球购物
C#笔试题集合
2013/06/21 面试题
解除劳动合同证明书
2014/09/26 职场文书
泸县召开党的群众路线教育实践活动总结大会新闻稿
2014/10/21 职场文书
患者身份识别制度
2015/08/06 职场文书