深入理解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 相关文章推荐
javascript入门·图片对象(无刷新变换图片)\滚动图像
Oct 01 Javascript
JavaScript实现级联菜单的方法
Jun 29 Javascript
使用jQuery中的wrap()函数操作HTML元素的教程
May 24 Javascript
jQueryUI 拖放排序遇到滚动条时有可能无法执行排序的小bug及解决方案
Dec 19 Javascript
详解从Vue.js源码看异步更新DOM策略及nextTick
Oct 11 Javascript
详解vue 单页应用(spa)前端路由实现原理
Apr 04 Javascript
Electron-vue脚手架改造vue项目的方法
Oct 22 Javascript
微信小程序传值以及获取值方法的详解
Apr 29 Javascript
JS回调函数深入理解
Oct 16 Javascript
Ant Design Vue 添加区分中英文的长度校验功能
Jan 21 Javascript
vuex 多模块时 模块内部的mutation和action的调用方式
Jul 24 Javascript
原生JS实现拖拽功能
Dec 16 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中HTTP方式下的Gzip压缩传输方法举偶
2007/02/15 PHP
二招解决php乱码问题
2012/03/25 PHP
php微信开发之上传临时素材
2016/06/24 PHP
基于Laravel 多个中间件的执行顺序详解
2019/10/21 PHP
Aster vs Newbee BO3 第三场2.18
2021/03/10 DOTA
JavaScript URL参数读取改进版
2009/01/16 Javascript
用jquery实现等比例缩放图片效果插件
2010/07/24 Javascript
JavaScript使用IEEE 标准进行二进制浮点运算产生莫名错误的解决方法
2011/05/28 Javascript
jquery+json实现数据列表分页示例代码
2013/11/15 Javascript
jquery中的过滤操作详细解析
2013/12/02 Javascript
判断客户浏览器是否支持cookie的示例代码
2013/12/23 Javascript
JavaScript中的console.dir()函数介绍
2014/12/29 Javascript
JS利用cookie记忆当前位置的防刷新导航效果
2015/10/15 Javascript
nodejs构建本地web测试服务器 如何解决访问静态资源问题
2017/07/14 NodeJs
react中使用css的7中方式(最全总结)
2019/02/11 Javascript
JavaScript解析机制与闭包原理实例详解
2019/03/08 Javascript
微信小程序实现图片上传
2019/05/23 Javascript
[46:27]DOTA2上海特级锦标赛主赛事日 - 1 胜者组第一轮#2LGD VS MVP.Phx第一局
2016/03/02 DOTA
python开发中range()函数用法实例分析
2015/11/12 Python
python3中dict(字典)的使用方法示例
2017/03/22 Python
[原创]教女朋友学Python(一)运行环境搭建
2017/11/29 Python
Python生成器定义与简单用法实例分析
2018/04/30 Python
python中字符串内置函数的用法总结
2018/09/13 Python
pandas分区间,算频率的实例
2019/07/04 Python
django日志默认打印request请求信息的方法示例
2020/05/17 Python
美国首屈一指的高品质珠宝设计师和零售商:Allurez
2018/01/23 全球购物
NIHAOMARKET官方海外旗舰店:意大利你好华人超市
2018/01/27 全球购物
伦敦一家西班牙童装精品店:La Coqueta
2018/02/02 全球购物
马来西亚最大的在线隐形眼镜商店:MrLens
2019/03/27 全球购物
预备党员党校学习自我评价分享
2013/11/12 职场文书
化学学院毕业生自荐信范文
2013/12/17 职场文书
高中生操行评语
2014/04/25 职场文书
法英专业大学生职业生涯规划范文:衡外情,量己力!
2014/09/23 职场文书
支部书记四风问题自我剖析材料
2014/09/29 职场文书
MySQL表类型 存储引擎 的选择
2021/11/11 MySQL
python绘制云雨图raincloud plot
2022/08/05 Python