jQuery.extend()
分类:实用工具
jQuery.extend( target [, object1 ] [, objectN ] )
描述:把两个或更多的对象合并到一起,放到第一个对象中。
如果向$.extend()
方法提供两个或更多的对象参数,来自这些对象的属性将都加到目标对象上。是null或undefined的参数会被忽略掉。
如果只向$.extend()
提供一个参数,意味着目标参数被省略了。这样的话,jQuery对象本身会被假定是这个目标。这么做,你就向jQuery命名空间添加了一个新函数。插件作者可以用它来向jQuery添加新的方法。
一定要记住,目标对象(第一个参数)会被修改,而且还会从$.extend()
中返回。然而,如果你想保持两个原始对象不变,你可以传入一个空对象作为目标对象来做到它:
var object = $.extend({}, object1, object2);
用$.extend()
实施的合并,默认是不递归的;如果第一个对象的属性的本身是一个对象或者数组,它将完全被第二个对象或后续对象中同名的属性重写。值没有合并。这在下面的例子中可以看到,通过检查banana的值。然而,通过向第一个函数参数传递true,将递归地合并对象。
警告:不支持向第一个参数传递false。
未定义的属性不会被复制。然而,继承自对象的原型的属性会被复制。属性是一个通过new MyCustomObject(args)
构造的对象,或者是一个内建的JavaScript类型,比如说Date对象或者RegExp对象,没有重构过,在作为纯对象出现在结果对象或者数组中。
在一个深扩展上,会扩展对象和数组,但是用原始类型包括的对象,比如说字符串、布尔值以及数字,不会扩展。深扩展一个循环的数据结构将导致一个错误。
若要满足超出这个行为的需求,请编写自定义的扩展函数,或者使用像lodash这样的库。
示例
合并两个对象,修改第一个对象。
<!doctype html> <html lang="en"> <head> <meta charset="utf-8"> <title>jQuery.extend demo</title> <script src="https://code.jquery.com/jquery-1.10.2.js"></script> </head> <body> <div id="log"></div> <script> var object1 = { apple: 0, banana: { weight: 52, price: 100 }, cherry: 97 }; var object2 = { banana: { price: 200 }, durian: 100 }; // 把object2合并到object1 $.extend( object1, object2 ); // Assuming JSON.stringify - not available in IE<8 $( "#log" ).append( JSON.stringify( object1 ) ); </script> </body> </html>
演示结果
递归的合并两个对象,修改第一个对象。
<!doctype html> <html lang="en"> <head> <meta charset="utf-8"> <title>jQuery.extend demo</title> <script src="https://code.jquery.com/jquery-1.10.2.js"></script> </head> <body> <div id="log"></div> <script> var object1 = { apple: 0, banana: { weight: 52, price: 100 }, cherry: 97 }; var object2 = { banana: { price: 200 }, durian: 100 }; // 递归地把object2合并到object1 $.extend( true, object1, object2 ); // Assuming JSON.stringify - not available in IE<8 $( "#log" ).append( JSON.stringify( object1 ) ); </script> </body> </html>
演示结果
合并默认值和选项,不修改默认值。这是一个常用的插件开发模式。
<!doctype html> <html lang="en"> <head> <meta charset="utf-8"> <title>jQuery.extend demo</title> <script src="https://code.jquery.com/jquery-1.10.2.js"></script> </head> <body> <div id="log"></div> <script> var defaults = { validate: false, limit: 5, name: "foo" }; var options = { validate: true, name: "bar" }; // 合并默认值和选项,不修改默认值 var settings = $.extend( {}, defaults, options ); // Assuming JSON.stringify - not available in IE<8 $( "#log" ).append( "<div><b>defaults -- </b>" + JSON.stringify( defaults ) + "</div>" ); $( "#log" ).append( "<div><b>options -- </b>" + JSON.stringify( options ) + "</div>" ); $( "#log" ).append( "<div><b>settings -- </b>" + JSON.stringify( settings ) + "</div>" ); </script> </body> </html>
演示结果