浅谈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 jqgrid 对含特殊字符json 数据的 Java 处理方法
Jan 01 Javascript
jquery mobile的触控点击事件会多次触发问题的解决方法
May 08 Javascript
JavaScript组件开发完整示例
Dec 15 Javascript
详解Angular的数据显示优化处理
Dec 26 Javascript
node跨域请求方法小结
Aug 25 Javascript
Vue-Access-Control 前端用户权限控制解决方案
Dec 01 Javascript
小程序实现留言板
Nov 02 Javascript
Vue.js的复用组件开发流程完整记录
Nov 29 Javascript
10个最受欢迎的 JavaScript框架(推荐)
Apr 24 Javascript
解决layui 表单元素radio不显示渲染的问题
Sep 04 Javascript
jquery css实现流程进度条
Mar 26 jQuery
关于vue 项目中浏览器跨域的配置问题
Nov 10 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静态类
2006/11/25 PHP
关于php操作mysql执行数据库查询的一些常用操作汇总
2013/06/24 PHP
php中Snoopy类用法实例
2015/06/19 PHP
PHP实现的限制IP投票程序IP来源分析
2016/05/04 PHP
PHP+mysql实现从数据库获取下拉树功能示例
2017/01/06 PHP
JS 参数传递的实际应用代码分析
2009/09/13 Javascript
IE7中javascript操作CheckBox的checked=true不打勾的解决方法
2009/12/07 Javascript
模仿百度三维地图的js数据分享
2011/05/12 Javascript
jquery 选项卡效果 新手代码
2011/07/08 Javascript
JavaScript中去掉数组中的重复值的实现方法
2011/08/03 Javascript
jquery $.getJSON()跨域请求
2011/12/21 Javascript
将字符串中由空格隔开的每个单词首字母大写
2014/04/06 Javascript
JavaScript静态类型检查工具FLOW简介
2015/01/06 Javascript
JavaScript实现单击下拉框选择直接跳转页面的方法
2015/07/02 Javascript
AngularJS入门(用ng-repeat指令实现循环输出
2016/05/05 Javascript
使用axios实现上传图片进度条功能
2017/12/21 Javascript
Angular 项目实现国际化的方法
2018/01/08 Javascript
react.js组件实现拖拽复制和可排序的示例代码
2018/08/20 Javascript
通过vue写一个瀑布流插件代码实例
2019/09/07 Javascript
layui动态渲染生成select的option值方法
2019/09/23 Javascript
react使用CSS实现react动画功能示例
2020/05/18 Javascript
python 七种邮件内容发送方法实例
2014/04/22 Python
python实现逆波兰计算表达式实例详解
2015/05/06 Python
python 全局变量的import机制介绍
2017/09/07 Python
Python 实现简单的shell sed替换功能(实例讲解)
2017/09/29 Python
Python运维之获取系统CPU信息的实现方法
2018/06/11 Python
使用python进行波形及频谱绘制的方法
2019/06/17 Python
Python动态强类型解释型语言原理解析
2020/03/25 Python
让Django的BooleanField支持字符串形式的输入方式
2020/05/20 Python
python 19个值得学习的编程技巧
2020/08/15 Python
Python识别处理照片中的条形码
2020/11/16 Python
自荐书格式
2013/12/01 职场文书
大家检讨书5000字
2014/02/03 职场文书
百年校庆宣传标语口号
2015/12/26 职场文书
用人单位的规章制度,怎样制定才是有效的?
2019/07/09 职场文书
深入浅析python3 依赖倒置原则(示例代码)
2021/07/09 Python