少しモヤモヤが解消されたのでmemoる

spidermonkeyを使ってコンソールで以下のJavaScriptを実行

js> var obj = new Object();
js> var fn = new Function();
js> print(typeof obj);
object
js> print(typeof fn);
function
js> print(typeof Object);
function
js> print(typeof String);
function
js> print(typeof Date);
function
js> print(typeof Array);
function
js> print(typeof Boolean);
function
js> print(typeof Number);
function
js> print(typeof window.Number);
typein:11: ReferenceError: window is not defined

最終行のwindowという変数はグローバルオブジェクトを参照するクライアントサイドJavaScriptでデフォルトで組み込まれている(グローバル)変数。なので、spidermonkeyから使用しようとしても組み込まれてませんのでエラー。ここで重要なことはグローバルオブジェクト(トップレベルで定義した変数とかはすべてこのオブジェクトのプロパティになる)自体はどちらにも存在するということで、windowというグローバルオブジェクトを参照する変数がここでは存在しないだけであるということ。グローバルオブジェクトとかきちんと理解しないと何も始まらない。


グローバルオブジェクトに関連して、上記コードでObjectやString等々のtypeofの結果が「function」であるのが解せなかったのですが、どうやらこれらは変数名であり、なんの変数名であるかというと「グローバルオブジェクト」の変数名であるということらしい。となれば、組み込み型と言われるこれらの文字列は、「コンストラクタとして呼ばれることが想定された関数オブジェクトを参照するグローバルオブジェクトのプロパティ」ということになり、すっきりした。


JavaScriptのコンストラクタって関数定義と基本的に定義の仕方は変わらない。newをつけて関数呼び出すとその関数はコンストラクタとして機能するという感じなので。それとJavaScriptの関数はオブジェクト。