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 相关文章推荐
IE中radio 或checkbox的checked属性初始状态下不能选中显示问题
Jul 25 Javascript
用js来定义浏览器中一个左右浮动元素相对于页面主体宽度的位置的函数
Jan 21 Javascript
JS的replace方法介绍
Oct 20 Javascript
React.js入门学习第一篇
Mar 30 Javascript
Bootstrap富文本组件wysiwyg数据保存到mysql的方法
May 09 Javascript
JS只能输入正整数的简单实例
Oct 07 Javascript
JavaScript中关于for循环删除数组元素内容时出现的问题
Nov 21 Javascript
JavaScript基于扩展String实现替换字符串中index处字符的方法
Jun 13 Javascript
Node.js微信 access_token ( jsapi_ticket ) 存取与刷新的示例
Sep 30 Javascript
vue在手机中通过本机IP地址访问webApp的方法
Aug 15 Javascript
express + jwt + postMan验证实现持久化登录
Jun 05 Javascript
解决angular 使用原生拖拽页面卡顿及表单控件输入延迟问题
Apr 21 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
PHP安装问题
2006/10/09 PHP
UCenter 批量添加用户的php代码
2012/07/17 PHP
PHP中如何定义和使用常量
2013/02/28 PHP
解析php中curl_multi的应用
2013/07/17 PHP
支持中文的PHP按字符串长度分割成数组代码
2015/05/17 PHP
PHP里的单例类写法实例
2015/06/25 PHP
php实现过滤字符串中的中文和数字实例
2015/07/29 PHP
php opendir()列出目录下所有文件的实例代码
2016/10/02 PHP
php 自定义错误日志实例详解
2016/11/12 PHP
jQuery源码分析-02正则表达式 RegExp 常用正则表达式
2011/11/14 Javascript
《JavaScript高级程序设计》阅读笔记(三) ECMAScript中的引用类型
2012/02/27 Javascript
JavaScript 高级篇之函数 (四)
2012/04/07 Javascript
原生javascript实现图片弹窗交互效果
2015/01/12 Javascript
JavaScript中的ajax功能的概念和示例详解
2016/10/17 Javascript
jquery.validate.js 多个相同name的处理方式
2017/07/10 jQuery
jQuery中each循环的跳出和结束实例
2017/08/16 jQuery
JS声明对象时属性名加引号与不加引号的问题及解决方法
2018/02/16 Javascript
vue-vuex中使用commit提交mutation来修改state的方法详解
2018/09/16 Javascript
js的继承方法小结(prototype、call、apply)(推荐)
2019/04/17 Javascript
Promise扫盲贴
2019/06/24 Javascript
微信小程序用户授权、位置授权及获取微信绑定手机号
2019/07/18 Javascript
在vue中使用vuex,修改state的值示例
2019/11/08 Javascript
H5实现手机拍照和选择上传功能
2019/12/18 Javascript
JavaScript中的this原理及6种常见使用场景详解
2020/02/14 Javascript
解决vue中axios设置超时(超过5分钟)没反应的问题
2020/09/04 Javascript
PyChar学习教程之自定义文件与代码模板详解
2017/07/17 Python
Django Haystack 全文检索与关键词高亮的实现
2020/02/17 Python
Python 抓取数据存储到Redis中的操作
2020/07/16 Python
Rag & Bone官网:瑞格布恩高级成衣
2018/04/19 全球购物
如何写毕业求职自荐信
2013/11/06 职场文书
七年级音乐教学反思
2014/01/26 职场文书
校园之星获奖感言
2014/01/29 职场文书
实习老师离校感言
2014/02/03 职场文书
职业生涯规划书范文
2014/03/10 职场文书
保卫钓鱼岛口号
2014/06/20 职场文书
让人感觉高大上的讲话稿怎么写?
2019/07/08 职场文书