在学习jQuery时jQuery.extend和jQuery.fn.extend这两个的区别没有搞得特别清楚,这几天趁着有点空闲时间就把这两个的区别详细的整理了以下。
jQuery为开发插件提拱了两个方法,jQuery的API手册中,extend方法挂载在jQuery和jQuery.fn两个不同对象上方法,在jQuery内部代码实现的是相同的,只是功能却不太一样。
我们先把jQuery看成了一个类,这样好理解一些。
jQuery.extend(object); 为扩展jQuery类本身.为类添加新的方法(静态方法)。
假设我们把jQuery这个类看成是动物类,能叫能吃饭能喝水能跳,现在我们用jQuery.extend这个方法给这个类拓展一个能唱歌的技能。这样的话,不论是什么动物都能继承这个技能(方法)了。
可以如下这样写着:
$.extend({
sing: function(){
console.log("我会唱歌!")
}
})
执行以下代码,就会打印‘我会唱歌!’
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
</head>
<body>
<script src="jquery.min.js"></script>
<script>
$(function(){
$.extend({
sing: function(){
console.log("我会唱歌!")
}
})
$.sing();
})
</script>
</body>
</html>
这说明.sing()变成了jQuery这个类本身的方法(object)了。他现在能”唱歌“了。
但是吧,这个能力啊,只有代表全动物的 jQuery 这个类本身,才能用啊。
所以啊,这个扩展也就是所谓的静态方法。只跟这个 类 本身有关。跟你具体的实例化对象是没关系的。
jQuery.fn.extend(object); 对jQuery.prototype进得扩展,就是给jQuery对象添加方法。
意思就是:假设sing()是拓展的方法:$('selector').sing();
如果是这么用$.sing();是会出错的。
执行以下代码
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
</head>
<body>
<input type="button" id="btn" value="按钮">
<script src="jquery.min.js"></script>
<script>
$(function(){
$.extend({
sing: function(){
console.log("我会唱歌!")
}
})
$("#btn").click(function(){
$.sing();
})
})
</script>
</body>
</html>
点击按钮就会打印‘我会唱歌!’
两者区别总结:
1、两者调用方式不同:
jQuery.extend(),一般由传入的全局函数来调用,主要是用来拓展个全局函数,如$.init(),$.ajax();
jQuery.fn.extend(),一般由具体的实例对象来调用,可以用来拓展个选择器,例如$.fn.each();
2、两者的主要功能作用不同:
jQuery.extend(object); 为扩展jQuery类本身,为自身添加新的方法。
jQuery.fn.extend(object);给jQuery对象添加方法
3、大部分插件都是用jQuery.fn.extend()