浅谈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 相关文章推荐
更正确的asp冒泡排序
May 24 Javascript
javascript实现的动态文字变换
Jul 28 Javascript
JS 判断undefined的实现代码
Nov 26 Javascript
AngularJS实用开发技巧(推荐)
Jul 13 Javascript
JavaScript中数组的各种操作的总结(必看篇)
Feb 13 Javascript
jQuery插件FusionCharts实现的MSBar3D图效果示例【附demo源码】
Mar 23 jQuery
webpack处理 css\less\sass 样式的方法
Aug 21 Javascript
vue中如何实现后台管理系统的权限控制的方法示例
Sep 19 Javascript
微信小程序实现列表页的点赞和取消点赞功能
Nov 02 Javascript
微信小程序页面缩放式侧滑效果的实现代码
Nov 15 Javascript
webpack HappyPack实战详解
Oct 08 Javascript
js验证密码强度解析
Mar 18 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增删改查示例自己写的demo
2013/09/04 PHP
Yii编程开发常见调用技巧集锦
2016/07/15 PHP
再论Javascript的类继承
2011/03/05 Javascript
JavaScript中将一个值转换为字符串的方法分析[译]
2012/09/21 Javascript
使用js显示当前时间示例
2014/03/02 Javascript
javascript使用正则获取url上的某个参数
2014/09/04 Javascript
JavaScript实现Iterator模式实例分析
2015/06/09 Javascript
Node.js事件驱动
2015/06/18 Javascript
ArtEditor富文本编辑器增加表单提交功能
2016/04/18 Javascript
浅谈jQuery中的checkbox问题
2016/08/10 Javascript
Web开发中客户端的跳转与服务器端的跳转的区别
2017/03/05 Javascript
vue组件初学_弹射小球(实例讲解)
2017/09/06 Javascript
Vue filter介绍及其使用详解
2017/10/21 Javascript
零基础之Node.js搭建API服务器的详解
2019/03/08 Javascript
使用Vue.js中的过滤器实现幂方求值的方法
2019/08/27 Javascript
[00:42]《辉夜杯》—职业组预选赛12月3日15点 正式打响
2015/12/03 DOTA
[42:50]NB vs VP 2018国际邀请赛小组赛BO2 第二场 8.18
2018/08/19 DOTA
Python解决鸡兔同笼问题的方法
2014/12/20 Python
python编程之requests在网络请求中添加cookies参数方法详解
2017/10/25 Python
Python标准库inspect的具体使用方法
2017/12/06 Python
python读取几个G的csv文件方法
2019/01/07 Python
python如何实现异步调用函数执行
2019/07/08 Python
python多进程(加入进程池)操作常见案例
2019/10/21 Python
python爬虫如何解决图片验证码
2021/02/14 Python
HTML5 Canvas自定义圆角矩形与虚线示例代码
2013/08/02 HTML / CSS
荷兰在线钓鱼商店:Raven
2019/06/26 全球购物
公务员培训自我鉴定
2013/09/19 职场文书
岗位说明书范文
2014/05/07 职场文书
入股合作协议书
2014/10/12 职场文书
2015年团支部工作总结
2015/04/03 职场文书
交通安全主题班会
2015/08/12 职场文书
2016年党员学习廉政准则心得体会
2016/01/20 职场文书
MySQL优化及索引解析
2022/03/17 MySQL
Python+OpenCV实现在图像上绘制矩形
2022/03/21 Python
Nginx动静分离配置实现与说明
2022/04/07 Servers
Python使用DFA算法过滤内容敏感词
2022/04/22 Python