http://davidwalsh.name/javascript-clone
難しそうだなーと思ったんだけど、テキトーにやってみた。
リンク先にコメントを書いたんだけど、改行とかがグチャグチャになった。
ごめんなさい外人さん。謝る英語がわかりません。
あと、なんか見たらコメント消えてたから、書き直したら二重に投稿された。
どうしよう。あわわわわわあわわわわわわ。
var clone = function(o){
var Clone = function(o){
var self = this;
if(o instanceof Array){
for(var i = 0,l = o.length;i < l;++ i){
self[i] = o[i];
}
}else{
for(var n in o){
self[n] = o[n];
}
}
};
if((!o)||(typeof(o) !== "object")){
return o;
}else{
o = new Clone(o);
return o;
}
};
var Clone = function(o){
var self = this;
if(o instanceof Array){
for(var i = 0,l = o.length;i < l;++ i){
self[i] = o[i];
}
}else{
for(var n in o){
self[n] = o[n];
}
}
};
if((!o)||(typeof(o) !== "object")){
return o;
}else{
o = new Clone(o);
return o;
}
};
/* 以下動きを検証している感じ */
var myObject = {hoge:"hogehoge"};
var cloned = clone(myObject);
alert("1 hogehoge と出て欲しい -> " + cloned.hoge);
myObject.hoge = "ohohohoho";
alert("2 hogehoge と出て欲しい -> " + cloned.hoge);
cloned.hoge = "ababababa";
alert("3 ababababa と出て欲しい -> " + cloned.hoge);
var next_clone = clone(myObject);
alert("4 ohohohoho と出て欲しい -> " + next_clone.hoge);
alert("5 ababababa と出て欲しい -> " + cloned.hoge);
var myArray = ["mogemoge","mugamuga","morimori"];
var array_clone = clone(myArray);
alert("6 mugamuga と出て欲しい -> " + array_clone[1]);
myArray[1] = "uhiuhi";
alert("7 mugamuga と出て欲しい -> " + array_clone[1]);
var deep = {obj:{hoge:"huga",func:function(){alert("do something");}}};
var deep_clone = clone(deep);
alert("8 huga と出て欲しい -> " + deep_clone.obj.hoge);
alert("9 次に do something と出て欲しい");
deep_clone.obj.func();
var myStr = "ho---ge";
var str_clone = clone(myStr);
alert("10 ho---ge と出て欲しい -> " + str_clone);
alert("11 ababababa と出て欲しい -> " + cloned.hoge);
別に
var Clone = function(o){
if((!o)||typeof(o) !== "object"){return;}
var self = this;
if(o instanceof Array){
for(var i = 0,l = o.length;i < l;++ i){
self[i] = o[i];
}
}else{
for(var n in o){
self[n] = o[n];
}
}
};
var myObj = {test:"huga"};
var cloned = new Clone(myObj);
でも動くことには動くと思うんだけど、
引数の o が object 以外だった時に、複製できない。
if((!o)||typeof(o) !== "object"){this = o;return;} // <- エラーになる
とか
if((!o)||typeof(o) !== "object"){return o;} // <- 意味なし
とか出来ないので、clone()の中で object かどうか判断してからーって感じです。
きっと、俺でも思いつくので、外国の凄い人は思いついた上で採用していないのだろう。
つまり、なんかしらこの方法だと問題あるんだろうなぁ。
そこがわからないので、俺は未熟なんだろうなぁとおもいます。
でも、とりあえず動くから良いよね!
0 件のコメント:
コメントを投稿