メッセージ欄

2009年11月の日記

一覧で表示する

オブジェクトのコピーと継承
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継承を使って一部違うオブジェクトを作るに便利だが、書き換えたものは元のオブジェクトにも反映する事に注意。

E4XとDOM
2009/11/13(金) 25:20 Javascriptはてブ情報 はてブに登録 はてブ数

リファレンスなど

仕様の日本語訳
チュートリアル
まとめ
アクセス方法、変換方法 E4X XML ↔ DOMノード
E4Xの特殊な動作、はまりどころ
バグ、パフォーマンス、文字結合
E4Xの使い方
E4Xの紹介
E4Xの使い方

実用例

toStringしたものをreplaceで置換してinnerHTML
toSourceしてinnerHTML
E4Xベースのテンプレートエンジン
E4Xの変数展開を理解
toXMLStringとDOMParser
Range + E4X
E4XからDOM生成
E4Xの解釈を用いたXSS