Ответ 1
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 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 a deep copy, they point
// to different objects.
Возвращаясь к extend
: я вижу только одно существенное различие, которое заключается в том, что jQuery extend
позволяет указать только один объект, и в этом случае сама цель jQuery
.
Общие сведения:
-
Это мелкая копия. Поэтому, если
src
имеет свойствоp
, которое ссылается на объект,dst
получит свойствоp
, которое относится к одному и тому же объекту (а не к копии объекта). -
Оба они возвращают объект назначения.
-
Оба они поддерживают несколько исходных объектов.
-
Оба они выполняют несколько исходных объектов по порядку, и поэтому последний объект-источник будет "выигрывать", если более одного исходного объекта имеет одно и то же имя свойства.
Страница тестирования: Live Copy | 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>