jQuery为开发插件,提供了两种方式:
$.extend
$.fn.extend
1.首先我们先了解一下$.extend:(extend(target: Object, object1: Object, objectN: Object, deep: Boolean, target: Object, object1: Object, objectN: Object): Object)
根据文档解释:“Merge the contents of two or more objects together into the first object.”,大概意思就是说,把两个或者更多内容合并到第一个对象中去;
举个例子来看一下:
合并两个对象到第一中去然后输出:
var object1={
apple:0,
banana:{weight:52,price:100},
cherry:97
};
var object2={
banana:{price:200},
watermelon:10
};
//开始合并,并返回结果
$.extend(object1,object2);
//定义一个打印对象的方法
var printObj=function(obj){
//定义一个数组
var arr=[];
//遍历对象并合并放到数组中
$.each(obj,function(key,val)
{
var next=key + ' : ' ;
//判断该值是否是对象,是的话递归,重新调用该函数,知道val不是对象为止,否则输出
next +=$.isPlainObject(val)?printObj(val):val;
//将连接好的字符串放到数组中
arr.push(next);
});
//最后返回json格式的字符串
return '{'+arr.join(',')+'}';
};
//弹出结果
alert(printObj(object1));
tips:如果你了解json的话对你理解这个很有帮助,其实extend()里面的参数形式都是json格式的;isPlainObject():判断是否是纯对象。
虽然JavaScript没有class的概念,但是我们用class思想去理解它,会更好理解。
想想,如果我们是把一个方法当作参数传进去呢,当然这时候extend()里面只能传一个{}.是不是也是类似上面的这种样式!$.extend({方法名:function(参数){方法体}});
所以$.extend()其实就是把参数当作一个静态的成员(方法或属性)传到jquery当中,这样我们在调用的时候就可以这样调用:$.方法名称(参数);比如:我们定义了一个弹出点击对象内容的方法:
$.extend({
alertCont:function(obj){
$(obj).click(function(){
alert($(this).html());
});
}
});
我们就是这么调用的:$.alertCont('td');
Tips2: jquery的extend还有一个重载类型,观察开头的extend的参数我们可以发现“deep: Boolean”这个参数,他的意思就是深度拷贝,我们第一例子中我们并没有指定具体值,因为默认不是深度拷贝也就是说deep的值为false,如果为:true则结果为:
2.$.fn.extend():其实就是向jquery当中传入“成员函数”,所以jquery就需要jquery实例来调用我们定义的方法。而不是通过$.methodName()来调用。但是具体传入的格式是类似的。
然后我们还是定义一个弹出点击对象内容的方法:
$.fn.extend({
alertCont:function(){
$(this).click(function(){
alert($(this).html());
});
}
}
);
然后调用:$('td').alertCont();
这里有一个非常好的网站:http://www.cnblogs.com/joey0210/p/3408349.html。更加详细的讲解了jquery插件,闭包等。