jquery插件之jquery.extend和jquery.fn.extend的区别
jquery.extend
jquery.extend(),是拓展jquery这个类,即可以看作是jquery这个类本身的静态方法,例如:
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<title>简单插件学习一</title>
<script src="../../Script/jquery.js"></script>
</head>
<body>
<input type="text" id="txtName" />
<script type="text/javascript">
;(function ($) {
$.extend({
test: function () {
alert("这是我测试的方775法3哈");
}
});
})(jQuery); $.test();
// $("#txtName").test();//不可以调用
</script>
</body>
</html>
即通过$.extend,扩充了Jquery本身,例如jquery上增加了test方法,只能其本身可以调用,跟具体的实例化对象没有一点关系,所以不可以用对象(具体的Dom节点)去调用。
jquery.fn.extend
从字面理解这个方法,就是拓展了jquery.fn的方法,而jquery.fn是啥玩意了 ,源码如下:
jQuery.fn = jQuery.prototype = {
// The current version of jQuery being used
jquery: version,
constructor: jQuery,
// Start with an empty selector
selector: "",
// The default length of a jQuery object is 0
length: 0,
toArray: function() {
return slice.call( this );
},
//.......
}
jquery.fn=jquery.prototype,就是原型,jquery.fn.extend扩展的就是jquery对象(原型的)方法,对象是啥?就是类的实例化 ,例如:$("#txtName"),就是jquery的对象
也就是说,jquery.fn.extend拓展方法,要用在jquery对象上才行,一般插件的制作是用此方法进行扩展的。例如:
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<title>简单插件学习一</title>
<script src="../../Script/jquery.js"></script>
</head>
<body>
<input type="text" id="txtName" />
<script type="text/javascript">
;(function ($) {
$.extend({
test: function () {
alert("这是我测试的方775法3哈");
}
}); $.fn.test2 = function () {
alert("这是我的方法3的");
$.fn.test2.sn.add();
} $.fn.test2.sn = {
defaults: {
dir: "H",
speed: 500
}, add: function () {
alert("滚动方式:" + this.defaults.dir);
}
} })(jQuery); $.test();
$("#txtName").test2();
</script>
</body>
</html>
jquery.extend()方法主要用于扩展全局函数,例如$.ajax这种,例如上面代码中的test方法,只可以通过jquery本身去调用即:$.test(), 而不可以通过 jquery 对象去调用。
jquery.fn.extend(),大部分插件都是用此方法的 ,例如:$("#txtName").test2();
除此之外,我们写jquery插件,还经常遇到一些参数传递的问题,这些一般都是通过jquery.extend方法传递的 ,下面我们就一起去了解一下,例如:
$.extend(dest,src1,src2,src3....)
它的含义是将src1,src2,src3等合并到dest中,并返回到dest,但是 合并之后改变dest的结果,所以一般推荐以下方式:
var setting=$.extend({},src1,src2,src3);//也就是用{}作为dest的参数
例如:
var setting = $.extend({}, { name: "alice", age: 28 }, { name: "stone", sex: "boy" });
console.log(setting);
后面的参数如果和前面的参数存在相同的名称,则会覆盖前面的参数值,合并后的 结果为:

例如插件中一般用到的此方法:
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<title>简单插件学习一</title>
<script src="../../Script/jquery.js"></script>
</head>
<body>
<input type="text" id="txtName" />
<script type="text/javascript">
;(function ($) {
$.fn.test2 = function (settings) {
settings = $.extend({}, $.fn.test2.sn.defaults, settings);
console.log(settings);
$.fn.test2.sn.add();
} $.fn.test2.sn = {
defaults: {
dir: "H",
speed: 500
}, add: function () {
alert("滚动方式:" + this.defaults.dir);
}
} })(jQuery); $("#txtName").test2({name:"alicetest",dir:"V"});
</script>
</body>
</html>
设置默认值,如果插件的传入的参数中存在此参数,则覆盖默认值,否则则使用默认值,例如上面的例子中输出结果为:

jquery的extend的重载原型
extend(boolean,dest,src1,src2,src3...);
其中第一个参数boolean代表是否进行深度拷贝,其余参数和之前一样,例如:
var result = $.extend(true, {}, { name: "alice", location: { city: "shanghai", country: "china" } }, { age: 28, name: "stone", location: { city: "beijing", state: "y" } });
console.log(result);
返回的结果为:

也就是 它会将src中的嵌套子对象也进行合并,即:location:{city:"beijing",country:"china",state:"y"}
如果将第一个参数传为false,效果又如何了,例如:
var result2 = $.extend(false, {}, { name: "alice",last:"222", location: { city: "shanghai", country: "china" } }, { age: 28, name: "stone", location: { city: "beijing", state: "y" } });
console.log(result2);
结果如下:

只会进行合并,不会再对嵌套的子对象进行合并,例如;location:{city:"beijing",state:"y"}
常用的扩展实例,例如:
$.extend($.net,{
hello:function(){
alert("这是全局对象拓展一个scroll命名空间");
}
});
这是将hello方法拓展到之前的jquery的net命名空间去,怎么调用??
例如,拓展动画中的$.easing:
$.extend($.easing,{
easeInSine: function (x, t, b, c, d) {
return -c * Math.cos(t/d * (Math.PI/2)) + c + b;
}
});
从jQuery API 文档中可以知道,jQuery自定义动画的函数.animate( properties [, duration] [, easing] [, complete] )有四个参数,以上代码是拓展了jquery.easing 中的easeInSine动画,
如果不拓展jquery.easing,则需要引入整个jquery.easing.1.3.js,因此为了减少代码的冗余,我们可以扩展$.easing中的方法;
具体调用如下:
$("#imgSrc").animate({
width: "90%",
height: "100%",
fontSize: "10em",
borderWidth: 10
}, "slow", "easeInSine", function () {
alert("移动了吗 ,哈哈");
});
以上就是jquery插件的一些用法,若有不足之处,请多多指教~~!
jquery插件之jquery.extend和jquery.fn.extend的区别的更多相关文章
- jQuery插件开发的两种方法及$.fn.extend的详解(转)
jQuery插件开发的两种方法及$.fn.extend的详解 jQuery插件开发分为两种:1 类级别.2 对象级别,下面为大家详细介绍下 jQuery插件开发分为两种: 1 类级别 类级别你可以 ...
- 不定义JQuery插件,不要说会JQuery[转载]
http://www.cnblogs.com/xcj26/p/3345556.html 不定义JQuery插件,不要说会JQuery 一:导言 有些WEB开发者,会引用一个JQuery类库,然后在网页 ...
- jQuery插件开发的两种方法及$.fn.extend的详解
jQuery插件开发分为两种: 1 类级别 类级别你可以理解为拓展jquery类,最明显的例子是$.ajax(...),相当于静态方法. 开发扩展其方法时使用$.extend方法,即jQuery.ex ...
- 不定义JQuery插件,不要说会JQuery 分类: JavaScript 2014-11-24 14:18 155人阅读 评论(0) 收藏
一:导言 有些WEB开发者,会引用一个JQuery类库,然后在网页上写一写$("#"),$("."),写了几年就对别人说非常熟悉JQuery.我曾经也是这样的人 ...
- [转]不定义JQuery插件,不要说会JQuery
一:导言 有些WEB开发者,会引用一个JQuery类库,然后在网页上写一写("#"),("."),写了几年就对别人说非常熟悉JQuery.我曾经也是这样的人,直 ...
- 不定义JQuery插件,不要说会JQuery
转自:http://www.cnblogs.com/xcj26/p/3345556.html 一:导言 有些WEB开发者,会引用一个JQuery类库,然后在网页上写一写$("#") ...
- 转:不会定义jQuery插件,不要说会jQuery
一:导言 有些WEB开发者,会引用一个JQuery类库,然后在网页上写一写$("#"),$("."),写了几年就对别人说非常熟悉JQuery.我曾经也是这样的人 ...
- 转载:不定义JQuery插件,不要说会JQuery
转载:http://www.cnblogs.com/xcj26/p/3345556.html 一:导言 有些WEB开发者,会引用一个JQuery类库,然后在网页上写一写$("#") ...
- (转)不定义JQuery插件,不要说会JQuery
原文地址:http://www.cnblogs.com/xcj26/p/3345556.html 一:导言 有些WEB开发者,会引用一个JQuery类库,然后在网页上写一写$("#" ...
- 使用jQuery插件时避免重复引入jquery.js文件
当一个页面使用多个jQuery插件时,需要避免重复引入jquery.js文件,因为后面映入的jQuery.js文件中定义的jQuery对象会覆盖掉前面的jQuery对象,导致之前定义的jQuery插件 ...
随机推荐
- TCP粘包处理通用框架--C代码
说明:该文紧接上篇博文“ linux epoll机制对TCP 客户端和服务端的监听C代码通用框架实现 ”讲来 (1)TCP粘包处理数据结构设计 #define MAX_MSG_LEN 65535 ty ...
- linux修改root管理员密码
以root 身份登录(SSH操作) 输入 passwd 命令 就可以看到提示输入新密码了 输入密码的时候是看不到字符的.
- Android小应用之拨号器
首先看一下Android Studio下怎么设置应用的ICON Activity的onCreate()方法 当界面刚被创建时会回调此方法,super.onCreate()执行父类的初始化操作,必须要加 ...
- eclipse +cygwin+C++
用Android eclipse做C++开发,一开始提示no binary的错误,貌似是因为没有编译二进制出来,我本机装了cygwin, 在命令台输入gcc,无显示,说明我没有把cygwin/bin的 ...
- android webview 加载本地html 实现 与 java 之间的相互响应
1.布局 <?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:androi ...
- C语言基础知识【C语言教程】
2017年7月7日23:15:51外边下雨,突然想学习c语言,所以刷一遍基础. 笔记:C 语言教程1.C 语言是一种通用的.面向过程式的计算机程序设计语言.1972 年,为了移植与开发 UNIX 操作 ...
- jquery实现全选、全消、反选功能
HTML代码: <input type="checkbox" name="checkbox" class="A" /> 使用按钮 ...
- mybatis 视频总结
[说明]mabatis卡住了,理解的不深,配置文件的格式太多看不懂(除了连接数据库的部分),听说还可以和log4j集成,怎么个方法 一:今日完成 1)一些语言细节和操作细节 比如在servlet里面操 ...
- java拾遗2----XML解析(二) SAX解析
XML解析之SAX解析: SAX解析器:SAXParser类同DOM一样也在javax.xml.parsers包下,此类的实例可以从 SAXParserFactory.newSAXParser() 方 ...
- 九度OJ 1194:八进制 (进制转换)
时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:3521 解决:2058 题目描述: 输入一个整数,将其转换成八进制数输出. 输入: 输入包括一个整数N(0<=N<=100000 ...