- // 合并两个或更多对象的属性到第一个对象中, jQuery 后续的大部分功能都通过该函数扩展
- // 通过 jQuery.fn.extend 扩展的函数, 大部分都会调用通过 jQuery.extend 扩展的同名函数
- // 如果传入两个或多个对象, 所有对象的属性会被添加到第一个对象 target
- // 如果只传入一个对象, 则将对象的属性添加到 jQuery 对象中.
- // 用这种方式, 我们可以为 jQuery 命名空间增加新的方法. 可以用于编写 jQuery 插件.
- // 如果不想改变传入的对象, 可以传入一个空对象:$.extend({
- }, object1, object2);
- // 默认合并操作是不迭代的, 即便 target 的某个属性是对象或属性, 也会被完全覆盖而不是合并
- // 第一个参数是 true, 则会迭代合并
- // 从 object 原型继承的属性会被拷贝
- // undefined 值不会被拷贝
- // 因为性能原因, JavaScript 自带类型的属性不会合并
- // jQuery.extend( target, [ object1 ], [ objectN ] )
- // jQuery.extend( [ deep ], target, object1, [ objectN ] )
- jQuery.extend = jQuery.fn.extend = function() {
- var options, name, src, copy, copyIsArray, clone,
- target = arguments[0] || {
- },
- i = 1,
- length = arguments.length,
- deep = false;
- // Handle a deep copy situation
- // 如果第一个参数是 boolean 型, 可能是深度拷贝
- if ( typeof target === "boolean" ) {
- deep = target;
- target = arguments[1] || {
- };
- // skip the boolean and the target
- // 跳过 boolean 和 target, 从第 3 个开始
- i = 2;
- }
- // Handle case when target is a string or something (possible in deep copy)
- // target 不是对象也不是函数, 则强制设置为空对象
- if ( typeof target !== "object" && !jQuery.isFunction(target) ) {
- target = {
- };
- }
- // extend jQuery itself if only one argument is passed
- // 如果只传入一个参数, 则认为是对 jQuery 扩展
- if ( length === i ) {
- target = this;
- --i;
- }
- for ( ; i < length; i++ ) {
- // Only deal with non-null/undefined values
- // 只处理非空参数
- if ( (options = arguments[ i ]) != null ) {
- // Extend the base object
- for ( name in options ) {
- src = target[ name ];
- copy = options[ name ];
- // Prevent never-ending loop
- // 避免循环引用
- if ( target === copy ) {
- continue;
- }
- // Recurse if we're merging plain objects or arrays
- // 深度拷贝且值是纯对象或数组, 则递归
- if ( deep && copy && ( jQuery.isPlainObject(copy) || (copyIsArray = jQuery.isArray(copy)) ) ) {
- // 如果 copy 是数组
- if ( copyIsArray ) {
- copyIsArray = false;
- // clone 为 src 的修正值
- clone = src && jQuery.isArray(src) ? src : [];
- // 如果 copy 的是对象
- } else {
- // clone 为 src 的修正值
- clone = src && jQuery.isPlainObject(src) ? src : {};
- }
- // Never move original objects, clone them
- // 递归调用 jQuery.extend
- target[ name ] = jQuery.extend( deep, clone, copy );
- // Don't bring in undefined values
- // 不能拷贝空值
- } else if ( copy !== undefined ) {
- target[ name ] = copy;
- }
- }
- }
- }
- // Return the modified object
- // 返回更改后的对象
- return target;
- };
来源: https://www.2cto.com/kf/201806/756698.html