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
// }