浅谈jQuery构造函数分析


Posted in Javascript onMay 11, 2015

在我的上一篇文章里面 阐述了jQuery的大致框架,知道了所有代码都是写在了一个自调用匿名函数里面,并且传入了window对象,源码是这样的:

(function( window, undefined ) {...})( window );

我们通过alert(jquery) 知道它是一个对象,那么这个对象是怎么构造出来的呢?我们使用$(document)类似的写法获取元素,就好像直接调用了普通的方法一样,jQuery就是普通的函数吗?如果是构造函数为什么不是 new $(document)的常见形式呢?

其实jQuery是面向对象js库,也有构造函数,每次调用jQuery方法是就会实例化一个jQeury对象,但是jQuery的写法却非常高明。

首先先谈谈js面向对象:  js虽然不是面向对象的语言,却又很多面向对象的写法,这里推荐大家看一下图灵的《javascript高级程序设计》中的面向对象的程序设计部分。在众多方法中比较常使用的写法是构造加原型方式,下面举例:

var Person=function(name,age){
  this.name=name;
  this.age=age;
}
Person.prototype={
 constructor:Person,
 init:function(msg){
  this.say(msg);
 },
 say:function(msg){
 alert(this.name+'说'+msg);
 }
};
var tom=new Person('tom',23); 
tom.init('你好');// tom说你好

其实jQuery也是采用的这种方式只不过用了更聪明的写法,一起再看看jQuery的构造函数有什么不同

// Define a local copy of jQuery
var jQuery = function( selector, context ) {
// The jQuery object is actually just the init constructor 'enhanced'
return new jQuery.fn.init( selector, context, rootjQuery );
},

从源码中可以看到在jQuery真正的函数是init方法,当我们调用jQuery时会返回new init()的结果而不直接new jQuery() .

jQuery.fn是啥呢,在后面我们会看到这样一句代码

jQuery.fn = jQuery.prototype = {...

这样就很好理解了,其实jQuery.fn就是原型对象也就是说在jQuery原型里面有一个init方法,这个方法是真正的构造函数。这样写的好处就是不需要在写$().init()这样的操作,直接就初始化了,但是还有一个问题就是既然init才是构造函数那我们写在jQuery上面的那么方法实例不是不能调用吗?init的实例化自然只能调用init的方法啦,往后看到这样一句代码

// Give the init function the jQuery prototype for later instantiation
jQuery.fn.init.prototype = jQuery.fn;

之前讲过jQuery.fn=jQuery.protype,这就意味着jQuery的原型对象赋给了init的原型,这样jQuery的原型方法自然init也就都有了,通过这样构造方式S使得使用jQuery方法非常简单既不需要new jQuery()的操作也不需要手动初始化就行调用普通函数一样简单。

Javascript 相关文章推荐
7款风格新颖的jQuery/CSS3菜单导航分享
Apr 23 Javascript
JS实现局部选择打印和局部不选择打印
Apr 03 Javascript
JavaScript中SetInterval与setTimeout的用法详解
Nov 10 Javascript
基于JavaScript实现全屏透明遮罩div层锁屏效果
Jan 26 Javascript
JS获取和修改元素样式的实例代码
Aug 06 Javascript
jQuery Easyui Tabs扩展根据自定义属性打开页签
Aug 15 Javascript
Vue.js结合bootstrap实现分页控件
Mar 10 Javascript
Vue.js tab实现选项卡切换
May 16 Javascript
node实现登录图片验证码的示例代码
Apr 20 Javascript
详解如何快速配置webpack多入口脚手架
Dec 28 Javascript
Node.js API详解之 zlib模块用法分析
May 19 Javascript
浅谈Web Storage API的使用
Jun 23 Javascript
在JavaScript中正确引用bind方法的应用
May 11 #Javascript
jQuery实现页面内锚点平滑跳转特效的方法总结
May 11 #Javascript
javascript实现验证IP地址等相关信息代码
May 10 #Javascript
招聘网站基于jQuery实现自动刷新简历
May 10 #Javascript
javascript实现获取字符串hash值
May 10 #Javascript
Javascript实现计算个人所得税
May 10 #Javascript
AngularJS基础知识笔记之表格
May 10 #Javascript
You might like
PHPlet在Windows下的安装
2006/10/09 PHP
ThinkPHP3.0略缩图不能保存到子目录的解决方法
2012/09/30 PHP
PHP实现微信公众平台音乐点播
2014/03/20 PHP
php实现微信原生支付(扫码支付)功能
2018/05/30 PHP
解决PHP curl或file_get_contents下载图片损坏或无法打开的问题
2019/10/11 PHP
laravel框架之数据库查出来的对象实现转化为数组
2019/10/23 PHP
一个不错的仿携程自定义数据下拉选择select
2014/09/01 Javascript
jquery简单实现外部链接用新窗口打开的方法
2015/05/30 Javascript
JQuery创建DOM节点的方法
2015/06/11 Javascript
比较常见的javascript中定义函数的区别
2015/11/09 Javascript
js跨域请求数据的3种常用的方法
2015/12/01 Javascript
js跨域资源共享 基础篇
2016/07/02 Javascript
for循环 + setTimeout 结合一些示例(前端面试题)
2017/08/30 Javascript
详解angularjs实现echart图表效果最简洁教程
2017/11/29 Javascript
微信小程序多音频播放进度条问题
2018/08/28 Javascript
webpack的tree shaking的实现方法
2019/09/18 Javascript
element-ui table组件如何使用render属性的实现
2019/11/04 Javascript
JavaScript前端实现压缩图片功能
2020/03/06 Javascript
[46:09]2014 DOTA2华西杯精英邀请赛 5 25 LGD VS VG第三场
2014/05/26 DOTA
[09:43]DOTA2每周TOP10 精彩击杀集锦vol.5
2014/06/25 DOTA
Python中利用Scipy包的SIFT方法进行图片识别的实例教程
2016/06/03 Python
利用python爬取斗鱼app中照片方法实例
2017/12/03 Python
用Python PIL实现几个简单的图片特效
2019/01/18 Python
python把1变成01的步骤总结
2019/02/27 Python
使用python3批量下载rbsp数据的示例代码
2019/12/20 Python
python代码如何注释
2020/06/01 Python
PyTorch 导数应用的使用教程
2020/08/31 Python
Python爬虫之Selenium实现窗口截图
2020/12/04 Python
Gibson London官网:以地道的英国男装而著称
2019/12/06 全球购物
为什么要使用servlet
2016/01/17 面试题
酒店管理毕业生自我鉴定
2014/03/02 职场文书
党员承诺书范文2015
2015/04/27 职场文书
个人廉政承诺书
2015/04/28 职场文书
2015年学校政教工作总结
2015/07/20 职场文书
使用pandas或numpy处理数据中的空值(np.isnan()/pd.isnull())
2021/05/14 Python
Win10多屏显示如何设置?Win10电脑多屏显示设置操作方法
2022/07/07 数码科技