浅谈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 相关文章推荐
提高网站信任度的技巧
Oct 17 Javascript
简略说明Javascript中的= =(等于)与= = =(全等于)区别
Apr 16 Javascript
jQuery中操控hidden、disable等无值属性的方法
Jan 06 Javascript
javascript实现动态标签云
Oct 16 Javascript
Sort()函数的多种用法
Mar 20 Javascript
js中的eval()函数把含有转义字符的字符串转换成Object对象的方法
Dec 02 Javascript
Node.js连接postgreSQL并进行数据操作
Dec 18 Javascript
vue 中filter的多种用法
Apr 26 Javascript
webpack 样式加载的实现原理
Jun 12 Javascript
利用React Router4实现的服务端直出渲染(SSR)
Jan 07 Javascript
基于Vue的商品主图放大镜方案详解
Sep 19 Javascript
深入理解Vue的数据响应式
May 15 Vue.js
在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与已存在的Java应用程序集成
2006/10/09 PHP
PHP基于yii框架实现生成ICO图标
2015/11/13 PHP
php微信公众号开发之简答题
2018/10/20 PHP
thinkphp 5框架实现登陆,登出及session登陆状态检测功能示例
2019/10/10 PHP
PHP7生产环境队列Beanstalkd用法详解
2020/05/19 PHP
JS控制显示隐藏兼容问题(IE6、IE7、IE8)
2010/04/01 Javascript
js中escape对应的C#解码函数 UrlDecode
2012/12/16 Javascript
Nginx上传文件全部缓存解决方案
2015/08/17 Javascript
JavaScript类型系统之基本数据类型与包装类型
2016/01/06 Javascript
使用jQuery卸载全部事件的思路详解
2017/04/03 jQuery
利用pm2部署多个node.js项目的配置教程
2017/10/22 Javascript
实例教学如何写vue插件
2017/11/30 Javascript
Vuex的基本概念、项目搭建以及入坑点
2018/11/04 Javascript
vue 地图可视化 maptalks 篇实例代码详解
2019/05/21 Javascript
解决vue打包后刷新页面报错:Unexpected token
2019/08/27 Javascript
Vue登录主页动态背景短视频制作
2019/09/21 Javascript
Auto.JS实现抖音刷宝等刷视频app,自动点赞,自动滑屏,自动切换视频功能
2020/05/08 Javascript
Python中的并发编程实例
2014/07/07 Python
Python中处理unchecked未捕获异常实例
2015/01/17 Python
python构建深度神经网络(续)
2018/03/10 Python
django中SMTP发送邮件配置详解
2019/07/19 Python
Python实现的企业粉丝抽奖功能示例
2019/07/26 Python
Django url,从一个页面调到另个页面的方法
2019/08/21 Python
Django 解决上传文件时,request.FILES为空的问题
2020/05/20 Python
python字典key不能是可以是啥类型
2020/08/04 Python
PyCharm 2020.1版安装破解注册码永久激活(激活到2089年)
2020/09/24 Python
Python .py生成.pyd文件并打包.exe 的注意事项说明
2021/03/04 Python
个人授权委托书范本
2014/04/03 职场文书
卖房协议书
2014/04/11 职场文书
中秋客户感谢信
2015/01/22 职场文书
2015年仓库工作总结
2015/04/09 职场文书
房地产销售员岗位职责
2015/04/11 职场文书
小学四年级作文之最感动的一件事
2019/11/01 职场文书
学会用Python实现滑雪小游戏,再也不用去北海道啦
2021/05/20 Python
WCG2010 星际争霸决赛 Flash vs Goojila 1 星际经典比赛回顾
2022/04/01 星际争霸
Nginx如何限制IP访问只允许特定域名访问
2022/07/23 Servers