深入理解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 简练的几个函数
Aug 29 Javascript
js对象的比较
Feb 26 Javascript
JavaScript高级程序设计 阅读笔记(十七) js事件
Aug 14 Javascript
js获取日期:昨天今天和明天、后天
Jun 11 Javascript
TypeScript Type Innference(类型判断)
Mar 10 Javascript
分享javascript实现的冒泡排序代码并优化
Jun 05 Javascript
基于BootStrap栅格栏系统完成网站底部版权信息区
Dec 23 Javascript
TypeScript中的方法重载详解
Apr 12 Javascript
vue实现表格过滤功能
Sep 27 Javascript
JS面向对象编程基础篇(一) 对象和构造函数实例详解
Mar 03 Javascript
解决vue安装less报错Failed to compile with 1 errors的问题
Oct 22 Javascript
js属性对象的hasOwnProperty方法的使用
Feb 05 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
执行iframe中的javascript方法
2008/10/07 Javascript
Javascript 遍历对象中的子对象
2009/07/03 Javascript
JavaScript日历实现代码
2010/09/12 Javascript
createElement与createDocumentFragment的点点区别小结
2011/12/19 Javascript
jquery中html、val与text三者属性取值的联系与区别介绍
2013/12/29 Javascript
Nodejs中调用系统命令、Shell脚本和Python脚本的方法和实例
2015/01/01 NodeJs
XML文件转化成NSData对象的方法
2015/08/12 Javascript
解决node.js安装包失败的几种方法
2016/09/02 Javascript
浅谈Node.js:理解stream
2016/12/08 Javascript
svg动画之动态描边效果
2017/02/22 Javascript
原生js封装运动框架的示例讲解
2017/10/01 Javascript
解决npm管理员身份install时出现权限的问题
2018/03/16 Javascript
使用JavaScript生成罗马字符的实例代码
2018/06/08 Javascript
cnpm加速Angular项目创建的方法
2018/09/07 Javascript
服务端预渲染之Nuxt(使用篇)
2019/04/08 Javascript
JavaScript 扩展运算符用法实例小结【基于ES6】
2019/06/17 Javascript
js实现简单的打印表格
2020/01/15 Javascript
[19:24]DOTA2客户端使用指南 一分钟快速设置轻松超神
2013/09/24 DOTA
python实现ip查询示例
2014/03/26 Python
git进行版本控制心得详谈
2017/12/10 Python
Python元组拆包和具名元组解析实例详解
2018/03/26 Python
Python可变参数*args和**kwargs用法实例小结
2018/04/27 Python
解决python3读取Python2存储的pickle文件问题
2018/10/25 Python
浅析Python 读取图像文件的性能对比
2019/03/07 Python
Python Matplotlib 基于networkx画关系网络图
2019/07/10 Python
Python类和实例的属性机制原理详解
2020/03/21 Python
python如何实现图片压缩
2020/09/11 Python
使用HTML5 Canvas API中的clip()方法裁剪区域图像
2016/03/25 HTML / CSS
HTML5+CSS设置浮动却没有动反而在中间且错行的问题
2020/05/26 HTML / CSS
汽车运用工程专业毕业生推荐信
2013/12/25 职场文书
会计专业职业规划:规划自我赢取未来
2014/02/12 职场文书
淘宝店铺营销方案
2014/02/13 职场文书
2014年三万活动总结
2014/04/26 职场文书
体育专业自荐书
2014/05/29 职场文书
校园文明标语
2014/06/13 职场文书
群众路线专项整治方案
2014/10/27 职场文书