今日何となく勉強する気にならなくて、windowオブジェクトのプロパティにどんな名前のプロパティがあるのか何となく気になったので、下のコードを書いてみました。

実行結果を見てあれ?となりました。windowオブジェクトのプロパティにselfやtopやparentがあるのはわかるのですが、window.windowが存在していることに疑問を感じました。クライアントサイドjavaScriptではwindowオブジェクトがグローバルオブジェクトのようなものだと、「サイ本」に書いてあったからです。

window.window 赤字のwindowは一体どこに存在しているんだろう。
これはつまり、WINDOWオブジェクトのプロパティにopenやlocationがるのと同じようにwindowというプロパティが存在していて、ただその参照先がWINDOWオブジェクトであるということなのだろうか。つまり、HTMLソース中に書いたwindowはWINDOW.windowであってこれはWINDOWそのもということなのか?

そうだとしたら、WINDOW.window.window.windowだってWINDOWということで、やっぱりそのプロパティの中にはwindowがいるということだろう。確かめてみよう。下のコードのvar w = window;をvar w = window.window.window;としても結果は同じだった。

windowからWINDOWにアクセスできるのはわかった。じゃあ、WINDOW自身は一体どこにいるんだ?

・・・・・・・・・・・・・・・・・・。

もう考えるのはよそう。きっとJavaScriptのインタプリタ的な何かがあれこれやってくれているんだろう。グローバルオブジェクトにもCallオブジェクトにもそれ自身にはアクセスできないのと同じなんだろう。そういうことにしておこう。

あっ、でもこれを読んだ人でWINDOWのいどころを知っている人にはぜひ教えていただきたい。そもそも自分の考え方が間違っている気もすしますが。

Window properties

Windowオブジェクトのプロパティとそのプロパティのプロパティをalert()とconsole.log()で表示する。
(function(){
	var w = window;
	var s = "";
	for(var p in w){
		s += p + ": " + w[p] + "\n";
		for (var pp in w[p])
			s += "\t" + pp + ": " + w[p][pp] + "\n";
	}
	alert(s);
	console.log(s);
})();
このコードはFirefox3.6では実行できません。太字の行で「Operation is not supported" code: "9」っていわれてFirebugに怒られました。IE8, Google Chrome9, Opera11では動きました。