jQueryでディープコピー
javascriptのオブジェクトの複製を
で空オブジェクトにコピーしてましたが、
Object.clone = function(source) {
return $.extend({},source);
}
このままだとシャローコピーだったのでハマッタヨ。
ガシカーシ、jQueryのソース眺めてたら。。。オッ
$.extendの一つ目の引数にtrueを追加しとくとディープコピーになるっぽい。
ということで、
Shallow Clone
Object.shallowCopy = function(source) {
return $.extend({},source);
}var a = {a:{a:1},b:{a:1}};
var b = Object.shallowCopy(a);
b.a.a = 2;
window.alert(a.a.a); //2
window.alert(b.a.a); //2
Deep Clone
Object.deepCopy= function(source) {
return $.extend(true,{},source);
}var a = {a:{a:1},b:{a:1}};
var b = Object.deepCopy(a);
b.a.a = 2;
window.alert(a.a.a); //1
window.alert(b.a.a); //2
せっかくなんでjQuery用に改良。
//object clone
(function($){
$.cloneObject = function(source,isDeep) {
if(isDeep){
return $.extend(true,{},source);
}
return $.extend({},source);
}
})(jQuery);//使い方
var a = {a:{a:1},b:{a:1}};
var b = $.cloneObject(a); //シャローコピーで複製
b.a.a = 2;
window.alert(a.a.a); //2
window.alert(b.a.a); //2
var c = {a:{a:1},b:{a:1}};
var d = $.cloneObject(c,true); //引数にtrueを追加するとディープコピーで複製
d.a.a = 2;
window.alert(c.a.a); //1
window.alert(d.a.a); //2
jQuery冥利に尽きますな(ΦωΦ)