JQuery 源码解析 · extend()详解

前言:最近想重写一个dropdown插件,于是想到了使用jquey实现插件,于是重温了一波$.extend()的知识,然后总结了这篇笔记

正文:

  1. $.extend(src) 
  • jQuery.extend(  target, object1 [, objectN ] )

  该方法将src合并到jquery的实例对象中去 

  下面是一个例子:

      var newSrc=$.extend({},src1,src2,src3...)//也就是将"{}"作为dtarget 目标参数 

  这样就可以将src1,src2,src3...进行合并,然后将合并结果返回给newSrc了。如下例:

     var result=$.extend({},{name:"Tom",age:21},{name:"Jerry",sex:"Boy"}) 

  那么合并后的结果,同名属性会被后面的对象所覆盖

1 console.log(result)
2 >> {name:"Jerry",age:21,sex:"Boy"}

  在ES6中,实现这种方法有一种更为简单的方法,利用点扩展运算符

1 var person1={name:"Tom",age:21}
2 var person2={name:"Jerry",sex:"Boy"}) 
3 
4 person1={...(person1),...(person2)}
  • jQuery.extend( [deep ], target, object1 [, objectN ] )

  第一个参数boolean代表是否进行深度拷贝,其余参数和前面介绍的一致,看下面这个例子

 1 var object1 = {
 2 apple: 0,
 3 banana: { weight: 52, price: 100 },
 4 cherry: 97
 5 };
 6 var object2 = {
 7 banana: { price: 200 },
 8 durian: 100
 9 };
10 
11 // Merge object2 into object1
12 $.extend( object1, object2 );
13 
14 console.log(JSON.stringify( object1 );
15 >>{"apple":0,"banana":{"price":200},"cherry":97,"durian":100}

   经过浅拷贝后,banana属性是对象类型,属于引用类型,指向object2的banana对象,所以没有了weight属性

  我们再看一下,如果是深度拷贝,则输出结果为:

1 $.extend( true, object1, object2 );
2 console.log(JSON.stringify( object1 );
3 >>{"apple":0,"banana":{"weight":52,"price":200},"cherry":97,"durian":100}

  2. $.fn.extend(src)

  该方法就是将src合并到jquery的全局对象中去

 1 jQuery.fn.extend({
 2 check: function() {
 3 return this.each(function() {
 4 this.checked = true;
 5 });
 6 },
 7 uncheck: function() {
 8 return this.each(function() {
 9 this.checked = false;
10 });
11 }
12 });
13 
14 // Use the newly created .check() method
15 $( "input[type='checkbox']" ).check();

  扩展,进阶

  利用这个函数,我们可以来写JQuery插件

 1 var Dropdown= function(element) {
 2 var self=this;
 3 var target=$(element).data("target");
 4 self.$element=$(element);
 5 self.$target=$(target);
 6 self.$element.on('mouseleave',function(){
 7 self.close(self.$target);
 8 });
 9 self.$element.on('mouseenter',function(){
10 self.open(self.$target);
11 });
12 }
13 //定义haorooms的方法
14 Dropdown.prototype = {
15 open: function($target) {
16 return $target.show();
17 },
18 close:function($target){
19 return $target.hide();
20 }
21 }
$.fn.myPlugin = function() {
//创建Dropdown的实体
var dropdown= new Dropdown(this);
}

  插件的使用

$(function() {
$('.dropdown').myPlugin();
})

然后用一个即使匿名函数,将我们的代码包裹起来,防止污染全局环境、防止其他地方使用到了 我们自定义插件的对象。

;(function($,window,document,undefined){
//我们的代码。。
})(jQuery,window,document);
原文地址:https://www.cnblogs.com/kasmine/p/6344383.html