jQuery.extend()は、複数のオブジェクトをマージ(併合)するメソッドである。
window.jQuery.extend(target [,object]...)
jQuery.extend(target [,object]...)
$.extend(target [,object]...)
window.jQuery.extend([deep,] target, object [,object]...)
jQuery.extend([deep,] target, object [,object]...)
$.extend([deep,] target, object [,object]...)
マージ先のオブジェクトを指定する。
マージするオブジェクトを指定する。
trueを指定した場合、マージは再帰的になる(ディープコピー)。falseを指定した場合、マージは再帰的にならない(シャローコピー)。
マージ結果のオブジェクトを返す。
<script>
var obj1 = { foo: 1, bar: 2 };
var obj2 = { baz: 3, qux: "quux" };
$.extend(obj1, obj2);
for (key in obj1) {
document.writeln(key + "=" + obj1[key]);
}
</script>
上記スクリプトの実行結果を次に示す。
引数に渡したオブジェクトの内容を変更されたくない場合、第1引数に空のオブジェクトを渡して、マージ結果は戻り値で取得する。
<script>
var obj1 = { foo: 1, bar: 2 };
var obj2 = { baz: 3, qux: "quux" };
var obj3 = $.extend({}, obj1, obj2);
for (key in obj3) {
document.writeln(key + "=" + obj3[key]);
}
</script>
jQuery.extend()は、JavaScriptのオブジェクトをコピーするのにも利用できる。JavaScriptにおいて、var obj2 = obj1;
はオブジェクトのコピーではなく、オブジェクトの参照になる。オブジェクト参照のサンプルを示す。
var obj1 = { foo: "old" };
var obj2 = obj1;
document.writeln('<p>obj2.foo = ' + obj2.foo + '</p>');
obj1.foo = "new";
document.writeln('<p>obj2.foo = ' + obj2.foo + '</p>');
上記サンプルの実行結果を示す。
上記のサンプルでは、
obj1
の内容を変更すると、
obj2
の内容も変わっている。
obj2 = jQuery.extend({}, obj1)
とすることでオブジェクトをコピーすることができる。
var obj1 = { foo: "old" };
var obj2 = jQuery.extend({}, obj1);
document.writeln('<p>obj2.foo = ' + obj2.foo + '</p>');
obj1.foo = "new";
document.writeln('<p>obj2.foo = ' + obj2.foo + '</p>');
上記サンプルの実行結果を示す。
シャローコピー(浅いコピー)とは、オブジェクト内に含まれるオブジェクトはコピーではなく参照となるコピーである。ディープコピー(深いコピー)とは、オブジェクト内に含まれるオブジェクトもコピーすることである。
jQuery.extend()のデフォルトのコピー方法はシャローコピーである。
jQuery.extend(true, ...)
とすることで、ディープコピーを行うことができる。
シャローコピーのサンプルを示す。
var obj1 = {
foo: {
bar: "old"
}
};
var obj2 = jQuery.extend({}, obj1);
document.writeln('<p>obj2.foo.bar = ' + obj2.foo.bar + '</p>');
obj1.foo.bar = "new";
document.writeln('<p>obj2.foo.bar = ' + obj2.foo.bar + '</p>');
シャローコピーの実行結果を示す。
ディープコピーのサンプルを示す。
var obj1 = {
foo: {
bar: "old"
}
};
var obj2 = jQuery.extend(true, {}, obj1);
document.writeln('<p>obj2.foo.bar = ' + obj2.foo.bar + '</p>');
obj1.foo.bar = "new";
document.writeln('<p>obj2.foo.bar = ' + obj2.foo.bar + '</p>');
ディープコピーの実行結果を示す。