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>
演示结果