ビルトインオブジェクト(Built-in Object)
私の認識では、組み込みオブジェクトは、console.logで'native code'と表示されることから、JavaScriptの中ではなく、ブラウザにもとから組み込まれているオブジェクトだと思っています。(この認識であっていますでしょうか?)
関数オブジェクトをコンソール出力した際の出力内容は実装依存です。
大概のブラウザは Object.toString()
と似通った値を出力し、こちらはECMAScript仕様で規定されています。
以下、Google ChromeとFirefoxで改行の有無の差異を除けば、同じ文字列が出力されました。
javascript
1console.log(Object.toString()); // "function Object() { [native code] }"
なお、「Object.toString()
が function Object() { [native code] }
を返す」のは、それが ビルトイン関数(built-in function) である為です。
3. If func is a built-in function object, return an implementation-defined String source code representation of func. The representation must have the syntax of a NativeFunction. Additionally, if func has an [[InitialName]] internal slot and func.[[InitialName]] is a String, the portion of the returned String that would be matched by NativeFunctionAccessoropt PropertyName must be the value of func.[[InitialName]].
関数は「オブジェクトの一部」ですので、ビルトイン関数をビルトインオブジェクト(Built-in Object)であるとみなすことはできますが、ビルトイン関数とビルトインオブジェクトは等価ではありません。
[[Prototype]]
[[Prototype]]
については一年前にも回答しています。
今一度、プロトタイプチェーンを調査し、情報を整理しておくことをお勧めします。
Object.getPrototypeOf()
は [[Prototype]]
を返しますので、コンソールで試行錯誤してみると良いと思います。
javascript
1console.log(Object.toString === Function.prototype.toString); // true
2console.log(Object.getPrototypeOf(Object) === Function.prototype); // true
3
4console.log(new Object().toString === Object.prototype.toString); // true
5console.log(Object.getPrototypeOf(new Object) === Object.prototype); // true
②のprototypeは継承だと思いますが、組み込みオブジェクトが何を継承しているのかが分かりません。
MDNでも「継承」という言葉が使われていますが、JavaScript(ECMAScript)はプロトタイプベース言語なので、クラスベース言語の「継承」を意識すると理解が困難になるかもしれません。
プロパティアクセスする際は常にプロトタイプチェーンによって [[Prototype]]
上のプロパティを参照することに注目してください。
「継承」という枠組みで考えるなら、常に [[Prototype]]
上のプロパティを「継承」しています。
[[Scopes]]
javascript
1console.dir(Object);
上記コードを実行した場合、Google Chromeは [[Scopes]]
を出力しますが、Firefoxは出力しません。
最新のECMAScriptにも [[Scopes]]
が存在しないことから、Google Chromeの独自拡張と思われます。
個人的には [[Scopes]]
を追いかけるよりも [[Prototype]]
を理解するのが先決かと思います。
ECMAScript仕様では、[[ ]]
で括られた名前はコード上からは参照できない内部的なプロパティのようなものとして定義される、と覚えておけば概ね問題ないかと思います。
ECMAScript仕様を "Internal Slot", "Internal Method" でページ検索すると関連情報が見つかります。
Re: susumu-99 さん