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自动填充勾选框即把勾选框打上true
Mar 24 Javascript
jquery+json实现动态商品内容展示的方法
Jan 14 Javascript
jQuery+CSS实现一个侧滑导航菜单代码
May 09 Javascript
vue.js入门(3)——详解组件通信
Dec 02 Javascript
jQuery中table数据的值拷贝和拆分
Mar 19 Javascript
JavaScript数组和对象的复制
Mar 21 Javascript
JS/jQuery实现DIV延时几秒后消失或显示的方法
Feb 12 jQuery
jQuery实现定时隐藏对话框的方法分析
Feb 12 jQuery
js中call()和apply()改变指针问题的讲解
Jan 17 Javascript
es6数据变更同步到视图层的方法
Mar 04 Javascript
jQuery实现王者荣耀手风琴效果
Jan 17 jQuery
JavaScript WeakMap使用详解
Feb 05 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
搜索引擎技术核心揭密
2006/10/09 PHP
第五章 php数组操作
2011/12/30 PHP
9条PHP编程小知识及易犯的小错误
2015/01/22 PHP
php的4种常见运行方式
2015/03/20 PHP
php动态生成版权所有信息的方法
2015/03/24 PHP
thinkphp3.2中Lite文件替换框架入口文件或应用入口文件的方法
2015/05/21 PHP
PHP使用PDO操作数据库的乱码问题解决方法
2016/04/08 PHP
PHP设计模式之观察者模式定义与用法示例
2018/08/04 PHP
解决 firefox 不支持 document.all的方法
2007/03/12 Javascript
JavaScript获得选中文本内容的方法
2008/12/02 Javascript
firefox下对ajax的onreadystatechange的支持情况分析
2009/12/14 Javascript
jQuery EasyUI 中文API Button使用实例
2010/04/14 Javascript
JQUBAR1.1 jQuery 柱状图插件发布
2010/11/28 Javascript
Jquery 自定义动画概述及示例
2013/03/29 Javascript
javascript学习笔记之10个原生技巧
2014/05/21 Javascript
如何用jQuery实现ASP.NET GridView折叠伸展效果
2015/09/26 Javascript
jquery实现全选、不选、反选的两种方法
2016/09/06 Javascript
ReactNative-JS 调用原生方法实例代码
2016/10/08 Javascript
jquery实现多次上传同一张图片
2017/01/09 Javascript
vuejs开发组件分享之H5图片上传、压缩及拍照旋转的问题处理
2017/03/06 Javascript
vue.js与后台数据交互的实例讲解
2018/08/08 Javascript
node+express框架中连接使用mysql(经验总结)
2018/11/10 Javascript
用vuex写了一个购物车H5页面的示例代码
2018/12/04 Javascript
ES6基础之展开语法(Spread syntax)
2019/02/21 Javascript
浅谈Python数据类型判断及列表脚本操作
2016/11/04 Python
Python实现复杂对象转JSON的方法示例
2017/06/22 Python
Django中login_required装饰器的深入介绍
2017/11/24 Python
Python代码注释规范代码实例解析
2020/08/14 Python
Python使用socket模块实现简单tcp通信
2020/08/18 Python
python 代码运行时间获取方式详解
2020/09/18 Python
Anya Hindmarch官网:奢侈设计师手袋及配饰
2018/11/15 全球购物
安全生产责任书
2014/03/12 职场文书
公司投资建议书
2014/05/16 职场文书
小学语文业务学习材料
2014/06/02 职场文书
大一新生检讨书
2014/10/29 职场文书
升学宴来宾致辞
2015/07/27 职场文书