オブジェクトのコピーと継承
- 循環参照を含むオブジェクトのディープコピー - 素人がプログラミングを勉強するブログ
- 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継承を使って一部違うオブジェクトを作るに便利だが、書き換えたものは元のオブジェクトにも反映する事に注意。コメント(0件)
- TB-URL http://efcl.info/adiary/022/tb/