旧それなりブログの跡地、画像やスタイルやJSなどが壊れてることがあります。

javascriptでの値の複製は?

2007年9月2日

prototype.jsのObject.cloneって、完全な複製じゃないですよね。
って、nobu氏に言われて、そういやそうだなと思った。
どういうことかというと

Object.extend = function(destination, source) {
for (var property in source) {
destination[property] = source[property];
}
return destination;
}
Object.clone: function(object) {
return Object.extend({}, object);
}
var foo = {a:[1,2,3]};
var bar = Object.clone(foo);
bar.a[0] = 4;
alert(foo.a); // -> [4,2,3] 参照渡しになっている

fooへの参照は切れているけど、fooの持つ各プロパティ ←→ barの持つ各プロパティ 間の参照は切れていないっつーことですな。

値渡しもしたいよねってことで

myClone = function(obj){
var clone = function(){};
for (var i in obj) clone.prototype[i] = obj[i];
return new clone;
};

prototypeに入れてnewしたら
値が複製されているんじゃないかとやってみると・・・

var foo = {a:[1,2,3]};
var bar = myClone(foo);
bar.a[0] = 4;
alert(foo.a); // -> [4,2,3] 参照渡しになっている

失敗か・・・。

evalを使ってソースコードを書くしか無いのかなぁ
【追記】

# kjirou
# jsで完全に・簡単に値渡しする方法ってないすかねー
# komagata
# RubyだったらMarshal.dump経由でいけそうだけどなー
# deep copyってことだよね?

値渡しと参照渡しをもっと正確に定義すると、deep copy と shallow copy ってプログラミング用語になるんですね。参考