jQuery extend()详解及简单实例

2020-05-17 06:21:10易采站长站整理

if ( typeoftarget !== "object" && !jQuery.isFunction(target) ) {
target= {};
}
// ExtendjQuery itself if only one argument is passed
if ( i ===length ) {
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)) ) ) {
if( copyIsArray ) {
copyIsArray= false;
clone= src && jQuery.isArray(src) ? src : [];
}else {
clone= src && jQuery.isPlainObject(src) ? src : {};
}
//Never move original objects, clone them
target[name ] = jQuery.extend( deep, clone, copy );
//Don't bring in undefined values
}else if ( copy !== undefined ) {
target[name ] = copy;
}
}
}
}
// Returnthe modified object
return target;
};

(1)首先,jQuery和其原型中extend()方法的实现使用的同一个函数。

(2)当extend()中只有一个参数的时候,是为jQuery对象添加插件。在jQuery上扩展的叫做工具方法,在jQuery.fn(jQuery原型)中扩展的是实例方法,即使在jQuery和原型上扩展相同名字的函数也可以,使用jQuery对象会调用工具方法,使用jQuery()会调用实例方法。

(3)当extend()中有多个参数时,后面的参数都扩展到第一个参数上。


var a={};
$.extend(a,{name:"hello"},{age:10});
console.log(a);//Object{name: "hello", age: 10}

(4)浅拷贝(默认):   


var a={};
varb={name:"hello"};
$.extend(a,b);
console.log(a);//Object{name: "hello"}
a.name="hi";
console.log(b);//Object{name: "hello"}

b不受a影响,但是如果b中一个属性为对象:


var a={};
varb={name:{age:10}};
$.extend(a,b);
console.log(a.name);//Object{age: 10}
a.name.age=20;
console.log(b.name);//Object{age: 20}

由于浅拷贝无法完成,则b.name会受到a的影响,这时我们往往希望深拷贝。