documentオブジェクトの挙動を変える

 あー、getElementByIdの動作変えたいなーとか、createElementの動作変えたいなー、という要求は多いかと思います。あ、javascriptの話ですよ。
 そんな変テコなことを考えるあなたにはこれ。インスタントdocument wrapping、もしくはdocumentのプロパティの上書き。そのまんま。


 どうするかっていうと、documentのオリジナルのプロパティをそのまま上書きするだけ。ただ、既存の動作も残したい場合はちょっと面倒。


 所望のプロパティのオリジナルを一時的に保存し、上書きする。意図としてはthisがdocumentなので、callでdocumentを指定。


 こうすることで、わりと直感的なdocumentのオーバーライドモドキができます。
以下はdocument.createElementでdivを作ろうとするとspanができて、spanを作ろうとするとdivができるという、ヘンチクリンなコード。オーバーライドでやっちゃいけないことの代表例w

var temp = {}
temp.createElement = document.createElement;
document.createElement = function( arg ){
	switch( arg ){
		case 'div':
			return temp.createElement.call( document, 'span' );
			break;
		case 'span':
			return temp.createElement.call( document, 'div' );
			break;
	}
	return temp.createElement.call( document, arg );
}
</html>


window.documentでも同様なことができる(はず)


HTMLのサンプルはこちら。

<html>
	<head>
	</head>
	<body>
		<div id="foo"></div>
		<script type="text/javascript">
			var temp = {}
			temp.createElement = document.createElement;
			document.createElement = function( arg ){
				switch( arg ){
					case 'div':
						return temp.createElement.call( document, 'span' );
						break;
					case 'span':
						return temp.createElement.call( document, 'div' );
						break;
				}
				return temp.createElement.call( document, arg );
			}

			document.getElementById( 'foo' ).appendChild( document.createElement( 'div' ) );
		</script>
	</body>
</html>


見た目には変化ないですが、先述した動作をしとります。domインスペクタで見ると良いかと。
使い道は全く不明ですが。


こんなヘンテコな遊びに付き合ってくれた友人に感謝。