angular.extend
и jQuery.extend
очень похожи. Оба они выполняют поверхностное копирование свойства из одного или нескольких исходных объектов в конечный объект. Так, например:
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
предоставляет глубокую копию:
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.
Возвращаясь к extend
: я вижу только одно существенное отличие: extend
в jQuery позволяет указать только один объект, и в этом случае целью является сам jQuery
.
Общие вещи:
Это мелкая копия. Таким образом, если src
имеет свойство p
, которое ссылается на объект, dst
получит свойство p
, которое ссылается на тот же объект (а не на копию объекта).
Оба они возвращают целевой объект.
Оба они поддерживают несколько исходных объектов.
Они оба выполняют несколько исходных объектов по порядку, поэтому последний исходный объект будет "выигрывать", если несколько исходных объектов имеют одно и то же имя свойства.
Тестовая страница: Динамическое копирование | Текущий источник
<!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>
person
T.J. Crowder
schedule
28.05.2013
by copying all of the properties
, и я бы предположил, что использование словаall
означаетeverything
, что является синонимомdeep copy
в мире JS. - person Ohgodwhy   schedule 28.05.2013p
) относится к объекту, ставлю доллары на пончики, что после вызова иsrc.p
, иdst.p
относятся к одному и тому же объекту. - person T.J. Crowder   schedule 28.05.2013