object=clone(object);

世の中にはdeep cloneの需要がある

僕もある。某ライブラリで実装せにゃならない。スマートな方法は思いつかず。永遠ループでまわしつづけています。この前見つけたネタのエントリ。
404 Blog Not Found:javascript - お伺い - Object.prototype.clone()
http://la.ma.la/blog/diary_200711270645.htm

clone関数を使ったときの挙動

clone関数を使うと分身(shogo4406)が変わってもオリジナル(shogo4405)には変化がない。ただ、オリジナル(shogo4405)が変化すると分身(shogo4406)も一緒に変身してしまうので用途によっては困る。

shogo4405 = { name:'shogo4405', age:22 };
shogo4406 = clone(shogo4405);

shogo4406.age = 23;
alert(shogo4405.age); // 22
alert(shogo4406.age); // 23

shogo4405.name = 'who?';
alert(shogo4405.name); // who?
alert(shogo4406.name); // who?
オリジナルの置き換え

で思いついたんだけどオリジナルをオリジナルのクローンで置き換えてあげるとオリジナルが変わっても分身は変わらない。もはや、shogo4405はオリジナルなのかといえるかは別だけど。こうなると何がオリジナルか分からなくなる。

shogo4406 = clone(shogo4405);
shogo4405 = clone(shogo4405);

shogo4405.name = 'who?';
alert(shogo4405.name); // who?
alert(shogo4406.name); // shogo4405
clone関数
function clone(o)
{
    var f = function(){};
    f.prototype = o;
    return new f();
};

Arrayはconcatで…

var foo = ['foo','bar'];
var bar = [].concat(foo);

bar[0] = 'bar';
foo[1] = 'foo';

alert(foo); // foo, bar
alert(bar); // bar, bar

あと

値をコピーできるのは1階層のみ。