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 自动填写表单的实现方法
Apr 09 Javascript
jQuery 中使用JSON的实现代码
Dec 01 Javascript
javascript匿名函数应用示例介绍
Mar 07 Javascript
根据配置文件加载js依赖模块
Dec 29 Javascript
三种方式实现瀑布流布局
Feb 10 Javascript
自定义事件解决重复请求BUG的问题
Jul 11 Javascript
基于iScroll实现下拉刷新和上滑加载效果
Jul 18 Javascript
zTree节点文字过多的处理方法
Nov 24 Javascript
利用node.js如何创建子进程详解
Dec 09 Javascript
Vue项目中如何引入icon图标
Mar 28 Javascript
详解vue-cli 构建项目 vue-cli请求后台接口 vue-cli使用axios、sass、swiper
May 28 Javascript
vue 数据操作相关总结
Dec 17 Vue.js
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
在PHP的图形函数中显示汉字
2006/10/09 PHP
上传文件先创建目录 再上传到目录里面去
2010/12/29 PHP
解析file_get_contents模仿浏览器头(user_agent)获取数据
2013/06/27 PHP
javascript 进阶篇3 Ajax 、JSON、 Prototype介绍
2012/03/14 Javascript
深入理解Javascript动态方法调用与参数修改的问题
2013/12/10 Javascript
js动态控制table的tr、td增加及删除的具体实现
2014/04/30 Javascript
js控制网页前进和后退的方法
2015/06/08 Javascript
js获取上传文件的绝对路径实现方法
2016/08/02 Javascript
javascript特殊文本输入框网页特效
2016/09/13 Javascript
JavaScript中访问id对象 属性的方式访问属性(实例代码)
2016/10/28 Javascript
three.js实现围绕某物体旋转
2017/01/25 Javascript
vuejs开发组件分享之H5图片上传、压缩及拍照旋转的问题处理
2017/03/06 Javascript
React-Native 组件之 Modal的使用详解
2017/08/08 Javascript
webpack4.0打包优化策略整理小结
2018/03/30 Javascript
简单的vuex 的使用案例笔记
2018/04/13 Javascript
基于elementUI使用v-model实现经纬度输入的vue组件
2019/05/12 Javascript
微信小程序之几种常见的弹框提示信息实现详解
2019/07/11 Javascript
基于Vue中的父子传值问题解决
2020/07/27 Javascript
Python random模块常用方法
2014/11/03 Python
简介二分查找算法与相关的Python实现示例
2015/08/26 Python
Python连接phoenix的方法示例
2017/09/29 Python
Python使用文件锁实现进程间同步功能【基于fcntl模块】
2017/10/16 Python
pandas string转dataframe的方法
2018/04/11 Python
python判断文件是否存在,不存在就创建一个的实例
2019/02/18 Python
Django框架会话技术实例分析【Cookie与Session】
2019/05/24 Python
python正则爬取某段子网站前20页段子(request库)过程解析
2019/08/10 Python
python TCP包注入方式
2020/05/05 Python
基于canvas的骨骼动画的示例代码
2018/06/12 HTML / CSS
美国在线奢侈品寄售商店:Luxury Garage Sale
2018/08/19 全球购物
欧洲最大的预定车位市场:JustPark
2020/01/06 全球购物
管理科学大学生求职信
2013/11/13 职场文书
商场经理竞聘演讲稿
2014/01/01 职场文书
公司委托书怎么写
2014/08/02 职场文书
清明节随笔
2015/08/15 职场文书
《玩出了名堂》教学反思
2016/02/17 职场文书
关于Oracle12C默认用户名system密码不正确的解决方案
2021/10/16 Oracle