jQuery.extend()| jqueryAPI 2.2 中文手册- AspRain.cn 致力于Web开发技术翻译整理

jQuery API 2.2.0

jQuery.extend()| jqueryAPI 2.2 中文手册- AspRain.cn 致力于Web开发技术翻译整理

jQuery.extend()

分类:实用工具

返回: Object

jQuery.extend( target [, object1 ] [, objectN ] )

描述:把两个或更多的对象合并到一起,放到第一个对象中。

加入于: 1.0
jQuery.extend( target [, object1 ] [, objectN ] )
  • target
    类型:Object
    一个对象,如果传入额外的对象,它将接受新的属性;或者如果它是唯一的参数,将扩展jQuery的命名空间。
  • object1
    类型:Object
    一个对象,它包含了要合并的额外的属性。
  • objectN
    类型:Object
    额外的对象,它包含了要合并的属性。
加入于: 1.1.4
jQuery.extend( [deep ], target, object1 [, objectN ] )
  • deep
    类型:Boolean
    如果是true,该合并会变成递归合并(又称为“深复制”)。
  • target
    类型:Object
    要扩展的对象。它将接受新属性。
  • object1
    类型:Object
    一个对象,它包含了要合并的额外的属性。
  • objectN
    类型:Object
    额外的对象,它包含了要合并的属性。

如果向$.extend()方法提供两个或更多的对象参数,来自这些对象的属性将都加到目标对象上。是nullundefined的参数会被忽略掉。

如果只向$.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>

演示结果

如果网页上不能运行示例,请点击http://www.asprain.cn/jQueryAPI/jquery.extend.htm查看示例。

如果你觉得本文档对你有用,欢迎给翻译作者支付宝打赏,支持翻译作者源源不断翻译更多有用的技术文档。