深入理解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 相关文章推荐
分享精心挑选的23款美轮美奂的jQuery 图片特效插件
Aug 14 Javascript
jquery zTree异步加载简单实例分享
Feb 05 Javascript
使用javascript实现json数据以csv格式下载
Jan 09 Javascript
利用jquery制作滚动到指定位置触发动画
Mar 26 Javascript
javascript判断图片是否加载完成的方法推荐
May 13 Javascript
AngularJS ng-style中使用filter
Sep 21 Javascript
js排序与重组的实例讲解
Aug 28 Javascript
详解Angularjs 自定义指令中的数据绑定
Jul 19 Javascript
javascript闭包的使用之按钮切换功能
Aug 30 Javascript
vue按需加载实例详解
Sep 06 Javascript
vue 对axios get pust put delete封装的实例代码
Jan 05 Javascript
JavaScript+HTML实现学生信息管理系统
Apr 20 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 动态随机生成验证码类代码
2010/04/09 PHP
纯PHP生成的一个树叶图片画图例子
2014/04/16 PHP
PHP中file_get_contents函数抓取https地址出错的解决方法(两种方法)
2015/09/22 PHP
使用php自动备份数据库表的实现方法
2017/07/28 PHP
用jQuery技术实现Tab页界面之二
2009/09/21 Javascript
js不完美解决click和dblclick事件冲突问题
2012/07/16 Javascript
javascript去除字符串中所有标点符号和提取纯文本的正则
2014/06/07 Javascript
Bootstrap模态框使用详解
2017/02/15 Javascript
集合Bootstrap自定义confirm提示效果
2017/09/19 Javascript
Angular2.0实现modal对话框的方法示例
2018/02/18 Javascript
jQuery 同时获取多个标签的指定内容并储存为数组
2018/11/20 jQuery
vue-cli 3.x配置跨域代理的实现方法
2019/04/12 Javascript
微信小程序实现拍照画布指定区域生成图片
2019/07/18 Javascript
javascript面向对象程序设计实践常用知识点总结
2019/07/29 Javascript
微信小程序 下拉刷新及上拉加载原理解析
2019/11/06 Javascript
Node.js中文件系统fs模块的使用及常用接口
2020/03/06 Javascript
Python中的tuple元组详细介绍
2015/02/02 Python
详解使用pymysql在python中对mysql的增删改查操作(综合)
2017/01/18 Python
Python3+django2.0+apache2+ubuntu14部署网站上线的方法
2018/07/07 Python
Python实现的简单计算器功能详解
2018/08/25 Python
python实现的MySQL增删改查操作实例小结
2018/12/19 Python
python进程池实现的多进程文件夹copy器完整示例
2019/11/27 Python
Python *args和**kwargs用法实例解析
2020/03/02 Python
Python实现子类调用父类的初始化实例
2020/03/12 Python
Django 设置admin后台表和App(应用)为中文名的操作方法
2020/05/10 Python
Penhaligon’s英国官网:成立于1870年的英国香水制造商
2021/02/18 全球购物
艺术学院毕业生自我评价
2014/03/02 职场文书
党员领导干部承诺书
2014/05/28 职场文书
大学生交通专业求职信
2014/09/01 职场文书
授权委托书样本
2014/09/25 职场文书
教师自我剖析材料
2014/09/29 职场文书
酒店销售经理岗位职责
2015/04/02 职场文书
党小组考察意见
2015/06/02 职场文书
新娘婚礼答谢词
2015/09/29 职场文书
解决Vue+SpringBoot+Shiro跨域问题
2021/06/09 Vue.js
java中为什么说子类的构造方法默认访问的是父类的无参构造方法
2022/04/13 Java/Android