angular.extend
et jQuery.extend
sont très similaires. Ils font tous les deux un peu profonde de la propriété de la copie à partir d'un ou plusieurs objets de la source à la destination de l'objet. Ainsi, par exemple:
var src = {foo: "bar", baz: {}};
var dst = {};
whatever.extend(dst, src);
console.log(dst.foo); // "bar"
console.log(dst.baz === src.baz); // "true", it's a shallow copy, both
// point to same object
angular.copy
fournit une profonde copie:
var src = {foo: "bar", baz: {}};
var dst = angular.copy(src);
console.log(dst.baz === src.baz); // "false", it's a deep copy, they point
// to different objects.
Pour en revenir à l' extend
: je ne vois qu'une différence importante, qui est celle de jQuery extend
vous permet de spécifier qu'un seul objet, auquel cas jQuery
lui-même est la cible.
De choses en commun:
C'est une copie. Donc, si src
a une propriété p
qui se réfère à un objet, dst
obtiendrez une propriété p
qui se réfère au même objet (pas une copie de l'objet).
Ils reviennent tous les deux l'objet de destination.
Ils sont tous deux en charge de multiples objets de la source.
Ils font tous les deux la source de multiples objets dans l'ordre, et donc, la dernière source de l'objet "gagner" dans le cas où plus d'un objet source a le même nom de propriété.
Page de Test: Vivre Copier | Live Source
<!DOCTYPE html>
<html>
<head>
<script src="http://code.jquery.com/jquery-1.9.1.min.js"></script>
<script src="http://ajax.googleapis.com/ajax/libs/angularjs/1.0.5/angular.min.js"></script>
<meta charset=utf-8 />
<title>Extend!</title>
</head>
<body>
<script>
(function() {
"use strict";
var src1, src2, dst, rv;
src1 = {
a: "I'm a in src1",
b: {name: "I'm the name property in b"},
c: "I'm c in src1"
};
src2 = {
c: "I'm c in src2"
};
// Shallow copy test
dst = {};
angular.extend(dst, src1);
display("angular shallow copy? " + (dst.b === src1.b));
dst = {};
jQuery.extend(dst, src1);
display("jQuery shallow copy? " + (dst.b === src1.b));
$("<hr>").appendTo(document.body);
// Return value test
dst = {};
rv = angular.extend(dst, src1);
display("angular returns dst? " + (rv === dst));
dst = {};
rv = jQuery.extend(dst, src1);
display("jQuery returns dst? " + (rv === dst));
$("<hr>").appendTo(document.body);
// Multiple source test
dst = {};
rv = angular.extend(dst, src1, src2);
display("angular does multiple in order? " +
(dst.c === src2.c));
dst = {};
rv = jQuery.extend(dst, src1, src2);
display("jQuery does multiple in order? " +
(dst.c === src2.c));
function display(msg) {
$("<p>").html(String(msg)).appendTo(document.body);
}
})();
</script>
</body>
</html>