部分摘自:
https://www.cnblogs.com/yuqingfamily/p/5813650.html
https://www.cnblogs.com/yuqingfamily/p/5775950.html
jQuery.extend() 函数用于将一个或多个对象的内容合并到目标对象。
注意:
$.extend( target [, object1 ] [, objectN ] )
指示是否深度合并
$.extend( [deep ], target, object1 [, objectN ] )
默认情况是false(浅拷贝),并且false是不能够显示的写出来的。如果想写,只能写true(深拷贝)~~
浅拷贝(false 默认):如果第二个参数对象有的属性第一个参数对象也有,那么不会进行相同参数内部的比较,直接将第一个对象的相同参数覆盖。
深拷贝(true):如果第二个参数对象有的属性第一个参数对象也有,还要继续在这个相同的参数向下一层找,比较相同参数的对象中是否还有不一样的属性,如果有,将其继承到第一个对象,如果没有,则覆盖。
var object1 = {
apple: 0,
banana: {
weight: 52,
price: 100
},
cherry: 97
};
var object2 = {
banana: {
price: 200
},
durian: 100
};
//默认情况浅拷贝
//object1--->{"apple":0,"banana":{"price":200},"cherry":97,"durian":100}
//object2的banner覆盖了object1的banner,但是weight属性未被继承
//$.extend(object1, object2);
//深拷贝
//object1--->{"apple":0,"banana":{"weight":52,"price":200},"cherry":97,"durian":100}
//object2的banner覆盖了object1的banner,但是weight属性也被继承了呦
$.extend(true,object1, object2);
console.log('object1--->'+JSON.stringify(object1));
jQuery.fn
jQuery.fn = jQuery.prototype = {
init: function(selector, context) {
//内容
}
}
关键是jQuery.fn = jQuery.prototype
为jQuery类添加类方法,可以理解为添加静态方法。
jQuery.extend({
min: function(a, b) {
return a < b ? a : b;
},
max: function(a, b) {
return a > b ? a : b;
}
});
jQuery.min(2, 3); // 2
jQuery.max(4, 5); // 5
为jQuery类添加“成员函数”。jQuery类的实例才可以调用这个“成员函数”。(js没有类概念,但是可以把jquery看做是一个封装好的类)
比如我们要开发一个插件,做一个特殊的编辑框,当它被点击时,便alert 当前编辑框里的内容。可以这么做:
$.fn.extend({
alertWhileClick: function() {
$(this).click(function() {
alert($(this).val());
});
}
});
//$("#input1")是jQuery的实例,调用这个扩展方法
$("#input1").alertWhileClick();
jQuery.extend() 的调用并不会把方法扩展到对象的实例上,引用它的方法也需要通过jQuery类来实现,如jQuery.init()
jQuery.fn.extend()的调用把方法扩展到了对象的prototype上,所以实例化一个jQuery对象的时候,它就具有了这些方法。
可以拓展一个对象到jQuery的 prototype里去,这样的话就是插件机制了。
(function ($) {
var namespace = 'colorful';
var methods = {
init: function (options) {
options = $.extend({}, $.fn[namespace].defaults, options);
if (options.color) {
this.css('color', options.color)
}
return this //保存链式
}
}
//可复用代码
$.fn[namespace] = function (method) {
if (methods[method]) {
return methods[method].apply(this, Array.prototype.slice.call(arguments, 1))
} else if (($.type(method) === 'object') || (method == null)) {
return methods.init.apply(this, arguments)
} else {
return $.error("Methods " + method + "not exist!")
}
}
$.fn[namespace].defaults = {
color: 'red'
}
})(jQuery);