少しモヤモヤが解消されたので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の関数はオブジェクト。