Go to comments

jQuery 工具方法 extend

$.extend() 方法和 fn.extend() 方法除了细微区别,基本上是一样的本质上都差不多,extend 在英文里原意是继承


功能

1. 扩展方法(重中之重)

2. 浅层克隆

3. 深层克隆


因为有插件库,jQuery 有很好的生态,插件库就是基于 $.extend 做到的,所以扩展方法是重中之重


$.extend() 和 $.fn.extend() 的源码用的是一个公用的方法区别在于 this

$.extened      this 指向 $

$.fn.extened  this 指向 $.fn

$.extened = $.fn.extened = function () {
  // $.extened this --> $
  // $.fn.extend this --> this.fn
}


区别

$.extend()      自定义方法加到工具方法

$.fn.extend()  自定义方法加到实例方法


一、扩展方法

$.extend()

写一个产生自定义范围的随机数的方法

<div id="demo" style="width:200px;height:100px;background:#008c8c;color:#fff;text-align:center;line-height:100px;"></div>

<script src="http://libs.baidu.com/jquery/2.0.0/jquery.min.js"></script>
<script>

  $.extend({
    definedMandom: function (start, final) {
      // [0, 1) * len + start
      var len = final - start;
      return Math.random() * len + start;
    },
    abc: function () {
      // 可以接着加方法abc
    }
  }); 

  // 如果有第二个团队,可以接着添加方法
  $.extend({

  });

  $('#demo').click(function(){
    var r = $.definedMandom(5, 10);
    $(this).text(r);
  });

</script>


$.fn.extend()

写 一个拖拽

<div id="drag" style="width:100px;height:100px;background-color:yellow;position:absolute;"></div>

<script src="http://libs.baidu.com/jquery/2.0.0/jquery.min.js"></script>
<script>

  $.fn.extend({
    drag: function(){
      var disX,
          disY,
          self = this;

      $(this).on('mousedown', function(e){

        disx = e.pageX - $(this).offset().left;
        disY = e.pageY - $(this).offset().top;

        $(document).on('mousemove', function (e) {
          $(self).css({
              left: e.pageX - disx, 
              top: e.pageY - disY,
            });
        });

        $(document).on('mouseup', function (e) {
          $(document).off('mousemove').off('mouseup');
        });

      });

      return this; 
    },
    abc: function () {
      
    }
  });


  $('#drag').drag().css({backgroundColor: 'orange'}); // 谁调用的.drag()方法,里面的this就是谁

</script>


二、浅层克隆

浅层克隆和深层克隆用 $.extend 和 $.fn.extend 都一样,参数由二位到多位


1、原始值的浅层克隆

从左向右  <-  继承,obj2 往 obj1 里面复制,不影响 obj2

var obj1 = {
  name: "a",
  age: 6
}

var obj2 = {
  name: "b",
  age: 50,
  smoke: true
}

$.extend(obj1, obj2);

console.log(obj1); // {name: 'b', age: 50, smoke: true}

原始值浅层克隆的效果

1. 重复的属性 age 被覆盖

2. 没有的属性 smoke 添加上


2、引用值的浅度克隆

引用值只复制数据地址,地址指向的是同一个房间,obj1 改变了 obj2 也跟着变

var obj1 = {
  name: "a",
  age: 6
}

var obj2 = {
  name: "b",
  age: 50,
  smoke: true,
  fortune: {
    ccb: 1000,
    icbc: 2000
  }
}

$.extend(obj1, obj2);

obj1.fortune.ccb = '钱都花完了余额0';

console.log(obj2.fortune.ccb); // 钱都花完了余额0


如果 obj1 也有同样的引用值 fortune 会被 obj2 覆盖

var obj1 = {
  name: "a",
  age: 6,
  fortune: {
    ccb: 0,
    icbc: 0
  }
}

var obj2 = {
  name: "b",
  age: 50,
  smoke: true,
  fortune: {
    ccb: 1000,
    icbc: 2000
  }
}

$.extend(obj1, obj2);

console.log(obj1.fortune); // {ccb: 1000, icbc: 2000}


3、三个参数的浅度克隆

把 obj2 里面的和 obj3 里面的东西,都放到 obj1 里面。注意,不是 obj3 放到 obj2 再放到 obj1,不管后面写多少个,都往 obj1 里面放

var obj1 = {
  name: "a",
  age: 6,
  fortune: {
    ccb: 0,
    icbc: 0
  }
}

var obj2 = {
  name: "b",
  age: 50,
  smoke: true,
  fortune: {
    ccb: 1000,
    icbc: 2000
  }
}

var obj3 = {
  name: "b",
  height: 180,
}

$.extend(obj1, obj2, obj3);

console.log(obj1); // {name: 'b', age: 50, fortune: {…}, smoke: true, height: 180}


三、深层克隆

深层克隆多一个参数 true


1、原始值的深层克隆

只有原始值的深层克隆跟浅层克隆规则一样

var obj1 = {
  name: "a",
  age: 6,
}

var obj2 = {
  name: "b",
  age: 50,
  smoke: true,
}

var obj3 = {
  name: "b",
  height: 180,
}

$.extend(true, obj1, obj2, obj3);

console.log(obj1); // {name: 'b', age: 50, smoke: true, height: 180}


2、有引用值的深层克隆

obj2 里面有引用值 fortune,obj1 里面没有引用值 fortune

var obj1 = {
  name: "a",
  age: 6
}

var obj2 = {
  name: "b",
  age: 50,
  smoke: true,
  fortune: {
    ccb: 1000,
    icbc: 2000 
  }
}

var obj3 = {
  name: "b",
  height: 180,
}

$.extend(true, obj1, obj2, obj3);

obj1.fortune.ccb += 123;

console.log(
  obj1.fortune.ccb, // 1123
  obj2.fortune.ccb  // 1000
);


obj1 和 obj2 里面都有引用值 fortrune

var obj1 = {
  name: "a",
  age: 6,
  fortune: {
    ccb: 0,
    icbc: 0
  }
}

var obj2 = {
  name: "b",
  age: 50,
  smoke: true,
  fortune: {
    ccb: 1000,
    icbc: 2000,
    BC: 3000,
  }
}

var obj3 = {
  name: "b",
  height: 180,
}

$.extend(obj1, obj2, obj3);

console.log(obj1);


// {
//   age: 50
//   fortune: {ccb: 1000, icbc: 2000, BC: 3000},
//   height: 180,
//   name: "b"
//   smoke: true
// }



Leave a comment 0 Comments.

Leave a Reply

换一张