javascriptでの値の複製は?
2007年9月2日
prototype.jsのObject.cloneって、完全な複製じゃないですよね。
って、nobu氏に言われて、そういやそうだなと思った。
って、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 ってプログラミング用語になるんですね。参考