深入理解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 相关文章推荐
js 判断图片是否加载完以及实现图片的预下载
Aug 14 Javascript
使用jquery.validate自定义方法实现"手机号码或者固话至少填写一个"的逻辑验证
Sep 01 Javascript
cookie的secure属性详解
Apr 08 Javascript
移动端横屏的JS代码(beta)
May 16 Javascript
jQuery滚动新闻实现代码
Jun 26 Javascript
Vue关于数据绑定出错解决办法
May 15 Javascript
微信小程序实现轮播图效果
Sep 07 Javascript
JavaScript数组,JSON对象实现动态添加、修改、删除功能示例
May 26 Javascript
百度小程序之间的页面通信过程详解
Jul 18 Javascript
解决layui数据表格Date日期格式的回显Object的问题
Sep 19 Javascript
javascript canvas API内容整理
Feb 16 Javascript
react的hooks的用法详解
Oct 12 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为什么选mysql作为数据库? Mysql 创建用户方法
2007/07/02 PHP
为何说PHP引用是个坑,要慎用
2018/04/02 PHP
thinkPHP5.0框架事务处理操作简单示例
2018/09/07 PHP
PHP面向对象程序设计之构造方法和析构方法详解
2019/06/13 PHP
php+jQuery ajax实现的实时刷新显示数据功能示例
2019/09/12 PHP
PHP发送邮件确认验证注册功能示例【修改别人邮件类】
2019/11/09 PHP
实用javaScript技术-屏蔽类
2006/08/15 Javascript
JavaScript 浮点数运算 精度问题
2009/10/06 Javascript
JQuery下关于$.Ready()的分析
2009/12/13 Javascript
JavaScript高级程序设计 DOM学习笔记
2011/09/10 Javascript
document.createElement()用法及注意事项(ff下不兼容)
2013/03/13 Javascript
详解Javascript事件驱动编程
2016/01/03 Javascript
jQuery Mobile页面返回不需要重新get
2016/04/26 Javascript
BootStrap glyphicon图标无法显示的解决方法
2016/09/06 Javascript
jquery 追加元素append、prepend、before、after用法与区别分析
2016/12/02 Javascript
javascript 单例模式详解及简单实例
2017/02/14 Javascript
JS设置随机出现2个数字的实例代码
2017/07/19 Javascript
使用vue点击li,获取当前点击li父辈元素的属性值方法
2018/09/12 Javascript
JS检索下拉列表框中被选项目的索引号(selectedIndex)
2019/12/17 Javascript
vue-cli或vue项目利用HBuilder打包成移动端app操作
2020/07/29 Javascript
python 解析XML python模块xml.dom解析xml实例代码
2014/02/07 Python
小议Python中自定义函数的可变参数的使用及注意点
2016/06/21 Python
玩转python selenium鼠标键盘操作(ActionChains)
2020/04/12 Python
python3+PyQt5实现使用剪贴板做复制与粘帖示例
2017/01/24 Python
PyQt5实现下载进度条效果
2018/04/19 Python
在Django的View中使用asyncio的方法
2019/07/12 Python
Python通用唯一标识符uuid模块使用案例
2020/09/10 Python
使用CSS3实现一个3D相册效果实例
2016/12/03 HTML / CSS
文明村创建实施方案
2014/03/27 职场文书
淘宝店策划方案
2014/06/07 职场文书
关于旅游的活动方案
2014/08/15 职场文书
个人剖析材料及整改措施
2014/10/07 职场文书
2015年幼儿园个人工作总结
2015/04/25 职场文书
PostGIS的安装与入门使用指南
2022/01/18 PostgreSQL
CSS实现渐变色边框(Gradient borders)的5种方法
2022/03/25 HTML / CSS
Nginx本地配置SSL访问的实例教程
2022/05/30 Servers