jQuery.fn和jQuery.prototype区别介绍


Posted in Javascript onOctober 05, 2013

近期在读jQuery的源码。

发现这里有个东西很难理解。

这里的 jQuery , jQuery.fn , jQuery,fn,init ,jQuery,prototype 都代表什么。

来看下jQuery的源码是怎么样定义的:

(function( window, undefined ) { var jQuery = (function() { 
// 构建jQuery对象 
var jQuery = function( selector, context ) { 
return new jQuery.fn.init( selector, context, rootjQuery ); 
} 
// jQuery对象原型 
jQuery.fn = jQuery.prototype = { 
constructor: jQuery, 
init: function( selector, context, rootjQuery ) { 
// something to do 
} 
}; 
// Give the init function the jQuery prototype for later instantiation 
jQuery.fn.init.prototype = jQuery.fn; 
// 合并内容到第一个参数中,后续大部分功能都通过该函数扩展 
// 通过jQuery.fn.extend扩展的函数,大部分都会调用通过jQuery.extend扩展的同名函数 
jQuery.extend = jQuery.fn.extend = function() {}; 
// 在jQuery上扩展静态方法 
jQuery.extend({ 
// something to do 
}); 
// 到这里,jQuery对象构造完成,后边的代码都是对jQuery或jQuery对象的扩展 
return jQuery; 
})(); 
window.jQuery = window.$ = jQuery; 
})(window);

这里我们可以看到:
var jQuery = function( selector, context ) { 
return new jQuery.fn.init( selector, context, rootjQuery ); 
}

jQuery 其实jQuery.fn.init()返回一个对象。那么jquery.fn.init()返回的又是什么呢?
jQuery.fn = jQuery.prototype = { 
constructor: jQuery, 
init: function( selector, context, rootjQuery ) { 
// something to do 
} 
};

就是从这里来的,一个javascript对象。

这里有个问题。

jQuery.fn = jQuery.prototype

那么就是 将jQuery 的原型对象赋值给了 jQuery.fn。

再看下面:

jQuery.fn.init.prototype = jQuery.fn;

看到这里我有一个想法。就是 将jQuery.fn 给了 jQuery.fn.init.prototype.

那么在这之前jQuery.fn.init.prototype.是什么?

是不是没有?这个时候它的原型是{};

那么为了可以去调用init外面的方法。就做了一个处理。

将jQuery.fn 赋值给jQuery.fn.init.prototype.这样的话,

jQuery.fn.init.prototype的原型也就是jQuery的原型对象就是 jQuery.fn ( 注意jQuery = function(return new jQuery.fn.init()))。

赋值了以后。在调用的时候,当init中没有方法的时候,就会去原型函数中调用。

那么这样的话。

你可能会想到这样一个东东:

jQuery.extends() 
jQuery.fn.extends()

我想你应该明白它们的区别了吧。

jQuery.extends()是直接扩展jQuery.而jQuery.fn.extends(),很明显是扩展的原型。

这就是为什么jQuery.fn.extends()中的大部分方法来自己于jQuery.extends()。

这里又将 jQuery.fn 赋值给了 jQuery.fn.init.prototype.

那么就有这样的一个关系:

jQuery.prototype = jQuery.fn = jQuery.fn.init.prototype
Javascript 相关文章推荐
javascript 处理HTML元素必须避免使用的一种方法
Jul 30 Javascript
JS上传图片前的限制包括(jpg jpg gif及大小高宽)等
Dec 19 Javascript
jquery ajax提交整个表单元素的快捷办法
Mar 27 Javascript
JS实现侧悬浮浮动实例代码
Nov 29 Javascript
JS判断客服QQ号在线还是离线状态的方法
Jan 13 Javascript
浅析JS原型继承与类的继承
Apr 07 Javascript
详解JavaScript中的自定义事件编写
May 10 Javascript
利用bootstrapValidator验证UEditor
Sep 14 Javascript
jQuery插件echarts实现的循环生成图效果示例【附demo源码下载】
Mar 04 Javascript
JS中mouseup事件丢失的原因与解决办法
Jun 14 Javascript
react-router v4如何使用history控制路由跳转详解
Jan 09 Javascript
vue 实现在同一界面实现组件的动态添加和删除功能
Jun 16 Javascript
javascript 函数声明与函数表达式的区别介绍
Oct 05 #Javascript
javascript自启动函数的问题探讨
Oct 05 #Javascript
纯js简单日历实现代码
Oct 05 #Javascript
JS教程:window.location使用方法的区别介绍
Oct 04 #Javascript
js中单引号与双引号冲突问题解决方法
Oct 04 #Javascript
jquery parent和parents的区别分析
Oct 02 #Javascript
jQuery插件 selectToSelect使用方法
Oct 02 #Javascript
You might like
ThinkPHP利用PHPMailer实现邮件发送实现代码
2013/09/26 PHP
PHP中CheckBox多选框上传失败的代码写法
2017/02/13 PHP
php 读写json文件及修改json的方法
2018/03/07 PHP
PHP程序员学习使用Swoole的理由
2018/06/24 PHP
csdn 博客的css样式 v3
2009/02/24 Javascript
jquery与js函数冲突的两种解决方法
2013/09/09 Javascript
javascript为下拉列表动态添加数据项
2014/05/23 Javascript
Javascript非构造函数的继承
2015/04/27 Javascript
jquery背景跟随鼠标滑动导航
2015/11/20 Javascript
深入理解jquery中的each用法
2016/12/14 Javascript
angularjs之$timeout指令详解
2017/06/13 Javascript
使用原生js封装的ajax实例(兼容jsonp)
2017/10/12 Javascript
vue源码入口文件分析(推荐)
2018/01/30 Javascript
Vue项目History模式404问题解决方法
2018/10/31 Javascript
Vue模板语法中数据绑定的实例代码
2019/05/17 Javascript
JavaScript数组去重实现方法小结
2020/01/17 Javascript
详解Node.js使用token进行认证的简单示例
2020/05/25 Javascript
一起来了解一下JavaScript的预编译(小结)
2021/03/01 Javascript
[51:26]VP vs VG 2018国际邀请赛小组赛BO2 第二场 8.19
2018/08/21 DOTA
Web服务器框架 Tornado简介
2014/07/16 Python
python微信跳一跳系列之色块轮廓定位棋盘
2018/02/26 Python
如何配置关联Python 解释器 Anaconda的教程(图解)
2020/04/30 Python
python3代码输出嵌套式对象实例详解
2020/12/03 Python
python爬取抖音视频的实例分析
2021/01/19 Python
python中time tzset()函数实例用法
2021/02/18 Python
基于html5绘制圆形多角图案
2016/04/21 HTML / CSS
Bobbi Brown芭比波朗美国官网:化妆师专业彩妆保养品品牌
2016/08/18 全球购物
Gtech官方网站:地毯清洁器、吸尘器及园艺设备
2018/05/23 全球购物
servlet面试题
2012/08/20 面试题
高中生学习生活的自我评价
2013/10/09 职场文书
委托公证书格式
2015/01/26 职场文书
小学新教师个人总结
2015/02/05 职场文书
预备党员考察表党小组意见
2015/06/01 职场文书
电影圆明园观后感
2015/06/03 职场文书
nginx部署多前端项目的几种方法
2021/05/25 Servers
Vue深入理解插槽slot的使用
2022/08/05 Vue.js