关于这两个方法,在看到面试题的时候,我是完全完全没有印象的(jq白学了)。。
具体还是在写浅拷贝的时候,在用object.assign的时候,看到一篇博主提到了$.extend,我才想起来,好像确实应该把这个知识点补充一下。
$.extend
这里提一嘴,关于$.extend的作用,有大佬直接在帖子里写:jQuery.extend(object);为扩展jQuery类本身.为类添加新的方法。好吧,这没错,不过我估计大多数萌新应该和我一样,完全没办法把这个和浅拷贝联系在一起吧。
$.extend,在菜鸟里,有更加浅显易懂的说法:jQuery.extend() 函数用于将一个或多个对象的内容合并到目标对象。也就是说,$.extend()方法提供的原始功能并不是仅有扩展jq类本身,还有合并对象。
在$.extend中,参数共有三个:Boolean, target, [, objectN ]。第一个参数可选,提供一个布尔值来决定方式是否深度合并对象,默认为false。第二个target为目标对象,意思是后续所有的对象全部合并进该对象中,objectN指被合并的N个对象。
所以本质上,extend是用来合并对象的,他的用法和assign非常类似。那么他究竟如何实现扩展jq类本身?原因在三个参数中,target目标参数是可以被省略的,这时候target就默认为jQuery对象本身。所以这时候,后续对象就会合并进入jQuery,因此可以用来为全局对象$添加新函数。
$.fn.extend
既然写了$.extend,不写$.fn.extend总感觉少了什么。
先说$.fn是啥?这里写个代码应该就一目了然了:
因此,其实就是原型。所以$.fn.extend就是为原型添加多个实例方法或属性。
总结:
1.$.extend可以实现和object.assign同样的功能。
2.$.extend为jQuery添加静态方法。$.fn.extend为jQuery添加实例方法