浅谈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 相关文章推荐
jQuery EasyUI 的EasyLoader功能介绍
Sep 12 Javascript
禁用页面部分JavaScript方法的具体实现
Jul 31 Javascript
jQuery实现连续动画效果实例分析
Oct 09 Javascript
jquery删除数组中重复元素
Dec 05 Javascript
十大 Node.js 的 Web 框架(快速提升工作效率)
Jun 30 Javascript
Angular利用trackBy提升性能的方法
Jan 26 Javascript
Webpack中publicPath路径问题详解
May 03 Javascript
TypeScript基础入门教程之三重斜线指令详解
Oct 22 Javascript
js使用swiper实现层叠轮播效果实例代码
Dec 12 Javascript
layui字体图标 loading图标静止不旋转的解决方法
Sep 23 Javascript
Bootstrap table 实现树形表格联动选中联动取消功能
Sep 30 Javascript
解决vue更新路由router-view复用组件内容不刷新的问题
Nov 04 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 表单验证实现代码
2009/03/10 PHP
PHP常用工具类大全附全部代码下载
2015/12/07 PHP
PHP从零开始打造自己的MVC框架之路由类实现方法分析
2019/06/03 PHP
JavaScript 入门·JavaScript 具有全范围的运算符
2007/10/01 Javascript
javascript function、指针及内置对象
2009/02/19 Javascript
原生js实现查找/添加/删除/指定元素的class
2013/04/12 Javascript
非常酷炫的Bootstrap图片轮播动画
2016/05/27 Javascript
简单实现js进度条加载效果
2020/03/25 Javascript
angular2 ng2 @input和@output理解及示例
2017/10/10 Javascript
vue新建项目并配置标准路由过程解析
2019/12/09 Javascript
通过vue刷新左侧菜单栏操作
2020/08/06 Javascript
让你30分钟快速掌握vue3教程
2020/10/26 Javascript
使用IronPython把Python脚本集成到.NET程序中的教程
2015/03/31 Python
python中xrange用法分析
2015/04/15 Python
使用PyCharm配合部署Python的Django框架的配置纪实
2015/11/19 Python
Python 爬虫学习笔记之正则表达式
2016/09/21 Python
Python中datetime模块参考手册
2017/01/13 Python
用virtualenv建立多个Python独立虚拟开发环境
2017/07/06 Python
Python基础学习之函数方法实例详解
2019/06/18 Python
如何表示python中的相对路径
2020/07/08 Python
python 实现Harris角点检测算法
2020/12/11 Python
使用css3实现的tab选项卡代码分享
2014/12/09 HTML / CSS
Expedia爱尔兰:酒店、机票、租车及廉价假期
2017/01/02 全球购物
马来西亚网上美容店:Hermo.my
2017/11/25 全球购物
The Kooples美国官方网站:为情侣提供的法国当代时尚品牌
2019/01/03 全球购物
在浏览器端如何得到服务器端响应的XML数据
2012/11/24 面试题
计算机开发个人求职信范文
2013/09/26 职场文书
军训的自我鉴定
2013/12/10 职场文书
致400米运动员广播稿
2014/02/07 职场文书
逃课上网检讨书
2014/02/20 职场文书
服装促销活动方案
2014/02/23 职场文书
《果园机器人》教学反思
2014/04/13 职场文书
令人印象深刻的自荐信
2014/05/25 职场文书
民间借贷纠纷答辩状
2015/08/03 职场文书
Golang 编译成DLL文件的操作
2021/05/06 Golang
python pygame 开发五子棋双人对弈
2022/05/02 Python