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 相关文章推荐
jquery重新播放css动画所遇问题解决
Aug 21 Javascript
js中直接声明一个对象的方法
Aug 10 Javascript
js分页工具实例
Jan 28 Javascript
jQuery层级选择器用法分析
Feb 10 Javascript
使用JavaScriptCore实现OC和JS交互详解
Mar 28 Javascript
微信小程序 聊天室简单实现
Apr 19 Javascript
ES6解构赋值实例详解
Oct 31 Javascript
JavaScript分步实现一个出生日期的正则表达式
Mar 22 Javascript
vue.js实现标签页切换效果
Jun 07 Javascript
详解微信小程序input标签正则初体验
Aug 18 Javascript
vue-cli的build的文件夹下没有dev-server.js文件配置mock数据的方法
Apr 17 Javascript
解决vue初始化项目一直停在downloading template的问题
Nov 09 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
《破坏领主》销量已超100万 未来将继续开发新内容
2020/03/08 其他游戏
PHP脚本数据库功能详解(中)
2006/10/09 PHP
PHP4和PHP5性能测试和对比 测试代码与环境
2007/08/17 PHP
在PHP中操作Excel实例代码
2010/04/29 PHP
php session安全问题分析
2011/06/24 PHP
php实现的网络相册图片防盗链完美破解方法
2015/07/01 PHP
PHP7.1新功能之Nullable Type用法分析
2016/09/26 PHP
PHP实现微信支付(jsapi支付)流程步骤详解
2018/03/15 PHP
[HTML/CSS/Javascript]WWTJS
2007/09/25 Javascript
js 实现无干扰阴影效果 简单好用(附文件下载)
2009/12/27 Javascript
jquery实用代码片段集合
2010/08/12 Javascript
Struts2的s:radio标签使用及用jquery添加change事件
2013/04/08 Javascript
Js冒泡事件详解及阻止示例
2014/03/21 Javascript
js实现精确到秒的日期选择器完整实例
2016/04/30 Javascript
jQuery Mobile 触摸事件实例
2016/06/04 Javascript
vue-cli+webpack记事本项目创建
2017/04/01 Javascript
Vue实现typeahead组件功能(非常靠谱)
2017/08/26 Javascript
JS实现简单的浮动碰撞效果示例
2017/12/28 Javascript
Vue 父子组件的数据传递、修改和更新方法
2018/03/01 Javascript
JavaScript 反射和属性赋值实例解析
2019/10/28 Javascript
详解vue-flickity的fullScreen功能实现
2020/04/07 Javascript
Python新手在作用域方面经常容易碰到的问题
2015/04/03 Python
Python编程之多态用法实例详解
2015/05/19 Python
python递归删除指定目录及其所有内容的方法
2017/01/13 Python
Python 2.x如何设置命令执行的超时时间实例
2017/10/19 Python
对pandas中两种数据类型Series和DataFrame的区别详解
2018/11/12 Python
python求加权平均值的实例(附纯python写法)
2019/08/22 Python
Windows上安装tensorflow  详细教程(图文详解)
2020/02/04 Python
浅谈PyTorch的可重复性问题(如何使实验结果可复现)
2020/02/20 Python
python实现文法左递归的消除方法
2020/05/22 Python
通过代码实例了解Python3编程技巧
2020/10/13 Python
CHRONEXT英国:您的首选奢华腕表目的地
2020/03/30 全球购物
C#中有没有静态构造函数,如果有是做什么用的?
2016/06/04 面试题
机房搬迁方案
2014/05/01 职场文书
作文批改评语
2014/12/25 职场文书
docker compose 部署 golang 的 Athens 私有代理问题
2022/04/28 Servers