オブジェクトのコピーと継承
2009/11/20(金) 24:35 Javascript親記事へこのエントリーをはてなブックマークに追加

循環参照を含むオブジェクトのディープコピー - 素人がプログラミングを勉強するブログ
http://d.hatena.ne.jp/javascripter/20081115/1226739628

	function deepCopy(orig) {
	  var clone = {};
	  return (function (orig, clone, visited, ref) {
	    for (var k in orig) {
	      var v = orig[k];
	      if (v instanceof Object) {
	        var i = visited.indexOf(v);
	        if (i == -1) {
	          var o = {};
	          visited.push(v);
	          ref.push(o);
	          clone[k] = arguments.callee(v, o, visited, ref);
	        } else {
	          clone[k] = ref[i];
	        }
	      } else {
	        clone[k] = v;
	      }
	    }
	    return clone;
	  })(orig, clone, [orig], [clone]);
	}
	// @src オブジェクトのコピーを返す
	function copyObject(src) {
		var dest;
		if (typeof src == 'object') {
			if (src instanceof Array) {
				dest = new Array();
				for (var i = 0; i < src.length; i++) {
					dest[i] = copyObject(src[i]);
				}
			} else {
				dest = new Object();
				for (prop in src) {
					dest[prop] = copyObject(src[prop]);
				}
			}
		} else {
			dest = src;
		}
		return dest;
	}
両方とも、lengthなどが扱えなくなる。
最速インターフェース研究会 :: JavaScriptにおけるdeep clone
http://la.ma.la/blog/diary_200711270645.htm

本当にそのままオブジェクトをコピーするならunevalしてevalするのが単純でいい。
Object.deep_clone = function(obj){
    return (typeof uneval == "function") ? eval(uneval(obj)) : eval(Object.toJSON(obj));
}
// Object.toJSONは別途適当に実装。prototype.jsに入ってたりしますね。
この場合はlengthも使用できる。

配列とオブジェクトのコピー - 宇宙野武士は元気にしているか
http://d.hatena.ne.jp/daisun/20080629/1214750999

チャイルドとして継承させる
function clone(obj) {
  var f = function();
  f.prototype = obj;
  return new f;
}
これはprototype継承を使って一部違うオブジェクトを作るに便利だが、書き換えたものは元のオブジェクトにも反映する事に注意。

名前:  非公開コメント   

  • TB-URL  http://efcl.info/adiary/022/tb/