浅谈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.TreeView结合ASP.Net和数据库生成菜单导航条
Aug 27 Javascript
Node.js 异步编程之 Callback介绍(一)
Mar 30 Javascript
Jquery 整理元素选取、常用方法一览表
Nov 26 Javascript
Vue.js 中的 $watch使用方法
May 25 Javascript
Vue.js学习笔记之常用模板语法详解
Jul 25 Javascript
浅谈React前后端同构防止重复渲染
Jan 05 Javascript
使用vue如何构建一个自动建站项目
Feb 05 Javascript
js事件on动态绑定数据,绑定多个事件的方法
Sep 15 Javascript
jQuery实现的导航条点击后高亮显示功能示例
Mar 04 jQuery
浅谈Vue中render中的h箭头函数
Nov 07 Javascript
JS forEach跳出循环2种实现方法
Jun 24 Javascript
详解webpack的clean-webpack-plugin插件报错
Oct 16 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的Yii框架中的event事件机制
2016/03/17 PHP
PHP将数据导出Excel表中的实例(投机型)
2017/07/31 PHP
Gird组件 Part-3:范例RSSFeed Viewer
2007/03/10 Javascript
javascript while语句和do while语句的区别分析
2007/12/08 Javascript
javascript开发中因空格引发的错误
2010/11/08 Javascript
Jquery Ajax的Get方式时需要注意URL地方
2011/04/07 Javascript
如何设置iframe高度自适应在跨域情况下的可用方法
2013/09/06 Javascript
写给小白的JavaScript引擎指南
2015/12/04 Javascript
Javascript原型链的原理详解
2016/01/05 Javascript
jQuery使用ajax跨域获取数据的简单实例
2016/05/18 Javascript
BootStrap table删除指定行的注意事项(笔记整理)
2017/02/05 Javascript
js 调用百度分享功能
2017/02/27 Javascript
教你5分钟学会用requirejs(必看篇)
2017/07/25 Javascript
Vue-cli创建项目从单页面到多页面的方法
2017/09/20 Javascript
教你用Cordova打包Vue项目的方法
2017/10/17 Javascript
使用vue-router切换页面时实现设置过渡动画
2019/10/31 Javascript
kNN算法python实现和简单数字识别的方法
2014/11/18 Python
用Python制作检测Linux运行信息的工具的教程
2015/04/01 Python
在Python的web框架中编写创建日志的程序的教程
2015/04/30 Python
详解Python文本操作相关模块
2017/06/22 Python
python 使用re.search()筛选后 选取部分结果的方法
2018/11/28 Python
kafka-python批量发送数据的实例
2018/12/27 Python
python多线程实现TCP服务端
2019/09/03 Python
详解python statistics模块及函数用法
2019/10/27 Python
兰蔻加拿大官方网站:Lancome加拿大
2016/08/05 全球购物
一个C/C++编程面试题
2013/11/10 面试题
第二层交换机和路由器的区别?第三层交换机和路由器的区别?
2013/05/23 面试题
数控技术专业推荐信
2013/11/01 职场文书
专科应届生求职信
2013/11/24 职场文书
廉洁家庭事迹材料
2014/05/15 职场文书
我的中国梦演讲稿1000字
2014/08/19 职场文书
暑期社会实践证明书
2014/11/17 职场文书
2015大学生党员自我评价范文
2015/03/03 职场文书
关于调整工作时间的通知
2015/04/24 职场文书
新闻简讯格式及范文
2015/07/22 职场文书
Nginx访问日志及错误日志参数说明
2021/03/31 Servers