浅谈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 相关文章推荐
网页常用特效代码整理
Jun 23 Javascript
20款超赞的jQuery插件 Web开发人员必备
Feb 26 Javascript
extjs中form与grid交互数据(record)的方法
Aug 29 Javascript
可恶的ie8提示缺少id未定义
Mar 20 Javascript
jQuery中contents()方法用法实例
Jan 08 Javascript
js 判断一组日期是否是连续的简单实例
Jul 11 Javascript
jQuery 选择符详细介绍及整理
Dec 02 Javascript
JS实现带动画的回到顶部效果
Dec 28 Javascript
js中如何完美的解析数据
Mar 18 Javascript
基于VuePress 轻量级静态网站生成器的实现方法
Apr 17 Javascript
iview通过Dropdown(下拉菜单)实现的右键菜单
Oct 26 Javascript
浅谈在不使用ssr的情况下解决Vue单页面SEO问题(2)
Nov 08 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
打造计数器DIY三步曲(下)
2006/10/09 PHP
jQuery 1.2.x 升? 1.3.x 注意事项
2009/05/06 Javascript
jQuery实现的产品自动360度旋转展示特效源码分享
2015/08/21 Javascript
jQuery Form表单取值的方法
2017/01/11 Javascript
滚动条的监听与内容随着滚动条动态加载的实现
2017/02/08 Javascript
微信小程序教程系列之新建页面(4)
2017/04/17 Javascript
详解vue 计算属性与方法跟侦听器区别(面试考点)
2018/04/23 Javascript
Node.js 使用AngularJS的方法示例
2018/05/11 Javascript
微信jssdk逻辑在vue中的运用详解
2018/11/14 Javascript
ES6学习教程之Promise用法详解
2020/11/22 Javascript
token 机制和实现方式
2020/12/15 Javascript
[02:41]2015国际邀请赛中国区预选赛观战指南
2015/05/20 DOTA
各个系统下的Python解释器相关安装方法
2015/10/12 Python
Python md5与sha1加密算法用法分析
2017/07/14 Python
Python基于递归算法实现的走迷宫问题
2017/08/04 Python
python爬虫headers设置后无效的解决方法
2017/10/21 Python
mac系统安装Python3初体验
2018/01/02 Python
Python数据分析之双色球统计单个红和蓝球哪个比例高的方法
2018/02/03 Python
python文件拆分与重组实例
2018/12/10 Python
PyTorch中的padding(边缘填充)操作方式
2020/01/03 Python
Python如何实现线程间通信
2020/07/30 Python
django表单中的按钮获取数据的实例分析
2020/07/31 Python
如何基于python实现年会抽奖工具
2020/10/20 Python
Ajxa常见问题都有哪些
2014/03/26 面试题
主管会计岗位责任制
2014/02/10 职场文书
运动会闭幕式解说词
2014/02/21 职场文书
《搭石》教学反思
2014/04/07 职场文书
2014年物业管理工作总结
2014/11/21 职场文书
新生入学欢迎词
2015/01/26 职场文书
酒会开场白大全
2015/06/01 职场文书
学历证明范文
2015/06/16 职场文书
2016年党支部公开承诺书
2016/03/25 职场文书
小学毕业教师寄语
2019/06/21 职场文书
Centos环境下Postgresql 安装配置及环境变量配置技巧
2021/05/18 PostgreSQL
pyqt5蒙版遮罩mask,setmask的使用
2021/06/11 Python
MySQL控制流函数(-if ,elseif,else,case...when)
2022/07/07 MySQL