深入理解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 应用 JQuery.groupTable.js
Dec 15 Javascript
jQuery 全选/反选以及单击行改变背景色实例
Jul 02 Javascript
JavaScript实现三阶幻方算法谜题解答
Dec 29 Javascript
JavaScript保存并运算页面中数字类型变量的写法
Jul 06 Javascript
Javascript控制div属性动态变化实例分析
Oct 08 Javascript
微信小程序开发经验总结(推荐)
Jan 11 Javascript
基于JS实现翻书效果的页面切换样式
Feb 16 Javascript
bootstrap 设置checkbox部分选中效果
Apr 20 Javascript
微信小程序 密码输入(源码下载)
Jun 27 Javascript
基于JavaScript实现幸运抽奖页面
Jul 05 Javascript
微信小程序模板消息限制实现无限制主动推送的示例代码
Aug 27 Javascript
Vuex模块化应用实践示例
Feb 03 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
收听短波不可能有声音清晰的品质吗
2021/03/01 无线电
最省空间的计数器
2006/10/09 PHP
Banner程序
2006/10/09 PHP
Discuz! Passport 通行证整合
2008/03/27 PHP
将数组写入txt文件 var_export
2009/04/21 PHP
PHP下判断网址是否有效的代码
2011/10/08 PHP
php获取汉字首字母的函数
2013/11/07 PHP
PHP中批量生成静态html(命令行下运行PHP)
2014/04/19 PHP
一个图片地址分解程序(用于PHP小偷程序)
2014/08/23 PHP
windows平台中配置nginx+php环境
2015/12/06 PHP
解决yii2左侧菜单子级无法高亮问题的方法
2016/05/08 PHP
php判断文件上传图片格式的实例详解
2017/09/30 PHP
jquery ajax同步异步的执行最终解决方案
2013/04/26 Javascript
jQuery实现div拖拽效果实例分析
2016/02/20 Javascript
javascript求日期差的方法
2016/03/02 Javascript
javascript将url解析为json格式的两种方法
2017/08/18 Javascript
微信小程序progress组件使用详解
2018/01/31 Javascript
Vue + better-scroll 实现移动端字母索引导航功能
2018/05/07 Javascript
谈谈JavaScript令人迷惑的==与+
2020/08/31 Javascript
vue使用Sass时报错问题的解决方法
2020/10/14 Javascript
在Python中使用sort()方法进行排序的简单教程
2015/05/21 Python
利用Python如何实现一个小说网站雏形
2018/11/23 Python
详解Appium+Python之生成html测试报告
2019/01/04 Python
Python使用crontab模块设置和清除定时任务操作详解
2019/04/09 Python
python通过TimedRotatingFileHandler按时间切割日志
2019/07/17 Python
python使用writerows写csv文件产生多余空行的处理方法
2019/08/01 Python
Python 一行代码能实现丧心病狂的功能
2020/01/18 Python
K近邻法(KNN)相关知识总结以及如何用python实现
2021/01/28 Python
纯css3实现照片墙效果
2014/12/26 HTML / CSS
英国在线花园中心:You Garden
2018/06/03 全球购物
中专三年学习的个人自我评价
2013/12/12 职场文书
医院辞职信范文
2014/01/17 职场文书
信息技术培训感言
2014/03/06 职场文书
父母对孩子的寄语
2014/04/09 职场文书
山东省召开党的群众路线教育实践活动总结大会新闻稿
2014/10/21 职场文书
鲁滨孙漂流记读书笔记
2015/06/30 职场文书