浅谈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 相关文章推荐
javascript fullscreen全屏实现代码
Apr 09 Javascript
JavaScript 格式字符串的应用
Mar 29 Javascript
一款由jquery实现的整屏切换特效
Sep 15 Javascript
关于Javascript加载执行优化的研究报告
Dec 16 Javascript
js实现兼容IE、Firefox的图片缩放代码
Dec 08 Javascript
vue2.0多条件搜索组件使用详解
Mar 26 Javascript
JS实现预加载视频音频/视频获取截图(返回canvas截图)
Oct 09 Javascript
vue中element组件样式修改无效的解决方法
Feb 03 Javascript
微信小程序实现tab左右切换效果
Nov 15 Javascript
小程序实现锚点滑动效果
Sep 23 Javascript
一起深入理解js中的事件对象
Feb 06 Javascript
如何用JS实现网页瀑布流布局
Apr 24 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
PHP.MVC的模板标签系统(四)
2006/09/05 PHP
PHP实现双链表删除与插入节点的方法示例
2017/11/11 PHP
php插入mysql数据返回id的方法
2018/05/31 PHP
PHP的垃圾回收机制代码实例讲解
2021/02/27 PHP
jquery插件之easing使用
2010/08/19 Javascript
node.js中的querystring.parse方法使用说明
2014/12/10 Javascript
jQuery插件slider实现拖动滑块选取价格范围
2015/04/30 Javascript
js操作浏览器的参数方法
2017/01/21 Javascript
layer弹出层中H5播放器全屏出错的解决方法
2017/02/21 Javascript
基于vue2.0实现简单轮播图
2017/11/27 Javascript
小程序指纹验证的实现代码
2018/12/04 Javascript
如何在JavaScript中优雅的提取循环内数据详解
2019/03/04 Javascript
Python对象体系深入分析
2014/10/28 Python
通过代码实例展示Python中列表生成式的用法
2015/03/31 Python
python 多维切片之冒号和三个点的用法介绍
2018/04/19 Python
pycharm new project变成灰色的解决方法
2019/06/27 Python
python 计算两个列表的相关系数的实现
2019/08/29 Python
python中设置超时跳过,超时退出的方式
2019/12/13 Python
python怎么判断素数
2020/07/01 Python
python读取xml文件方法解析
2020/08/04 Python
Python中的特殊方法以及应用详解
2020/09/20 Python
python爬虫 requests-html的使用
2020/11/30 Python
微信浏览器左上角返回按钮拦截功能
2017/11/21 HTML / CSS
html5指南-5.使用web storage存储键值对的数据
2013/01/07 HTML / CSS
美国在线和移动免费会员制批发零售商:Boxed(移动端的Costco)
2020/01/02 全球购物
雅虎笔试题(字符串操作)
2015/03/24 面试题
一些Solaris面试题
2015/12/22 面试题
请写出一段Python代码实现删除一个list里面的重复元素
2015/12/29 面试题
市场营销专业个人自荐信格式
2013/09/21 职场文书
常务副总经理岗位职责
2014/04/12 职场文书
中央空调节能方案
2014/06/15 职场文书
2015年敬老月活动总结
2015/03/27 职场文书
鉴史问廉观后感
2015/06/10 职场文书
步步惊心观后感
2015/06/12 职场文书
运动会致辞稿
2015/07/29 职场文书
详解pytorch创建tensor函数
2022/03/22 Python