jquery提供的extend,主要是將其他object的屬性,copy到target這個object。
jQuery.extend( target, [ object1 ], [ objectN ] );
當extend return時,與target是同一個object。
相當於以下的code:
for(var name in object) target[ name ] = object[name];
但是這樣會有一個問題,當object裡的屬性有object或是array時,他並不會配置新的記憶體,而時指向同個記憶體。
</span>
例如:
var object = {key:3,data:{name:"sparrow"}}; var target = {}; $.extend(target,object); //result:sparrow console.log(object.data.name); target.data["name"] = "peter"; //result:peter console.log(target.data.name); console.log(object.data.name);
所以這時jquery有提供一個deep參數:
jQuery.extend( [ deep ], target, object1, [ objectN ] )
當deep會true時,他會用遞迴的方式,將array和object配置一個新的空間,然後將值複製過去。
jquery主要copy source code如下:
// 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;
}