ホストオブジェクト 【開眼!JavaScript】
JavaScriptの学習メモ。
今日は「開眼!JavaScript」の第2章を読んでみます。
2.9 ホストオブジェクト
JavaScriptのオブジェクトについて、
- ネイティブオブジェクト
- ホストオブジェクト
- グローバルオブジェクト
という用語が出てきます。
(p.47)
WebブラウザなどのJavaScript実行環境は「ホストオブジェクト」と呼ばれる複数のオブジェクトを持っています。
たとえば、Webブラウザ環境では、windowオブジェクトと、windowオブジェクトに保持されているすべてのオブジェクト(ECMAScript標準によって定義され、JavaScript言語が提供しているネイティブオブジェクトを除く)がホストオブジェクトとみなされます。
当然ながら、ホストオブジェクトの種類やそれぞれの動作については実装環境に依存します。
ネイティブオブジェクト
JavaScriptには必ず用意されている基本的なオブジェクト。
「ECMAScript」の規格として定められています。
ホストオブジェクト
ネイティブオブジェクト以外のオブジェクトで、JavaScriptの実行環境によって用意されている様々なオブジェクト。
実行環境が違うと、ホストオブジェクトの品揃えも違ってきます。
グローバルオブジェクト
ネイティブオブジェクトやホストオブジェクトを含む、全てのオブジェクトの親玉がグローバルオブジェクトです。
「ネイティブオブジェクト+ホストオブジェクト=グローバルオブジェクト」
という包含関係になっています。
windowオブジェクトのプロパティを列挙
Webブラウザーのホストオブジェクトは、「windowオブジェクト」です。
windowオブジェクトの中身は、どうなっているのでしょうか?
(p.48)
http://jsfiddle.net/jseja/KJcPt/
上記コードをVisual Studio Code+Node.jsで実行すると、以下の結果が出ました。
例外が発生しました: Error
ReferenceError: window is not defined at Object.<anonymous>
Node.jsのホストオブジェクトには、windowオブジェクトがありませんでした。
(参考)
Node.jsのJavaScriptはどういうコンテキストで動く? | KIIDAX
Node.jsではwindowは存在しない。
Node.jsではなく、Chromeで実行してwindowオブジェクトを見てみます。
上記HTMLファイルをChromeで開き、コンソール画面で見ると以下の結果が出ました。
Chromeのwindowオブジェクトには、いろんなプロパティが用意されていました。
この例で出力されたものがホストオブジェクトです。
JavaScriptのネイティブオブジェクトが列挙されていませんが、ブラウザは一般的にホストオブジェクトとネイティブオブジェクトを区別します。
window.documentオブジェクトのプロパティを列挙
(p.48)
次の例をWebブラウザで実行すると、ブラウザで提供されているwindow.documentオブジェクトのプロパティを列挙します。
http://jsfiddle.net/jseja/s6vBV/
上記HTMLファイルをChromeで開き、コンソール画面で見ると以下の結果が出ました。
Chromeのwindowオブジェクトの中にあるdocumentオブジェクトの中には、いろんなプロパティがありました。
ここで理解してほしいのは、JavaScript言語仕様とホストオブジェクトの間には何も関係がないということです。
JavaScript「言語」が提供するもの(JavaScript 1.5、ECMA-262 Edition 3や、MozillaのJavaScript1.6、1.7、1.8、1.8.1、1.8.5など)と、ホスト環境が用意するものは別のものなので、これらを混同してはいけません。
Node.jsのホストオブジェクト
WebブラウザーとNode.jsのホストオブジェクトは違います。
Node.jsには、どんなホストオブジェクトが用意されているのでしょうか?
JavaScriptのグローバルオブジェクトを調べる方法
Functionコンストラクタ
Functionコンストラクタは現在使われている主要なすべての環境で使えるし、スコープ非依存でstrict modeの影響も受けない。というわけで、個人的にFunction("return this")()をよく使っている。
上記のサンプルコードを参考にして、Node.jsのグローバルオブジェクトにアクセスして、ホストオブジェクトを見てみましょう!
上記コードをVisual Studio Code+Node.jsで実行すると、以下の結果が出ました。
何かたくさん出てきたけど、よく分からないのでググってみました★
:
:
:
→ ググっても、結局よく分かりませんでしたwww
詳細は不明ですが、Node.jsにはいろんなホストオブジェクトが用意されてるようです。
ホスト環境とは?
[NOTE]JavaScriptが動作するホスト環境(Webブラウザなど)は、「グローバルオブジェクト」を用意しています。
このオブジェクトにはJavaScriptのネイティブの言語環境といくつかのホストオブジェクト(Webブラウザのwindow.locationなど)と、ユーザ定義オブジェクトが保持されています。
JavaScriptのオブジェクトをざっくり分類する(シリーズその2) - Qiita
hostオブジェクト
host(ホスト)という言葉は、例えば「ホームパーティーのホスト」のように使われる「場所を提供する」という意味合いがある。
host環境の中でJavaScriptは実行するコンテクストを得る。
ブラウザがホストに該当する。
「JavaScriptのホスト環境」とは、実行環境のことですね?
「ホスト」の意味
プログラミングの用語は英語だらけ!>< (→ 単語の意味を再確認w)
出生地の、自国の、本来の、その国に生まれた、その土地固有の、土着の、(…の)原産で、土産(どさん)で、生まれつきの、生来の
(客をもてなす)主人(役)、ホスト(役)、(大会などの)主催者、当番役、(旅館などの)亭主、(寄生動物の)宿主
地球全体の、世界的な、グローバルな、全体的な、包括的な、球状の、球形の
無理矢理日本語に置き換えたら、
- ネイティブオブジェクト → 自前の物
- ホストオブジェクト → 提供された物
- グローバルオブジェクト → 全体の物
…みたいなかんじ?(日本語でOK)
ホストオブジェクトは外部ライブラリー?
「ホストオブジェクト」という命名について、素朴な疑問。
- ネイティブオブジェクトがメイン(全ての実行環境で共通)
- ホストオブジェクトがサブ(実行環境ごとに違う)
なら、ホストオブジェクトは「外部ライブラリー」なのでしょうか?
javascriptにおけるホストオブジェクトは、外部ライブラリ、つまり部外者が特定のファイルを拡張するもので、尚且つ取り換えできてこれが無くても問題なく動作するものと認識しております。
もし上記があっているならば、なぜ外部ライブラリという名称を使わずにホストオブジェクトと呼称するのでしょうか。
ECMAScriptは、ホスト環境内で計算を行ったり、オブジェクトを操作したりするためのオブジェクト指向言語である。(中略)
スクリプティング言語とは、既存のシステムの機能を操作、カスタマイズ、自動化するために使用されるプログラミング言語のことである。
ということで、C言語などのようなプログラミング言語と違ってマシンの上で直接動くのではなく、ブラウザなど何かしらの環境の中で動くのが前提となっていて、この「何かしら」に当たるのがホスト環境です。
JavaScriptは、C言語のようなコンパイル言語ではなく、ブラウザーなどのホスト環境で動くインタープリター言語として主に使われています。
ホスト環境ごとに、柔軟に仕様を拡張できる長所を強調するため、「外部ライブラリー」じゃなくて「ホストオブジェクト」という名前で呼んでいるのでしょうか?
実質的な意味としては、「ホストオブジェクト」は「外部ライブラリー」と同じだと思いました。
→ネイティブオブジェクトは同じままだけど、ホストオブジェクトは環境ごとに交換可能なパワーアップアイテムみたいなもの?
いろいろなホストオブジェクト
JavaScriptが動く環境(ホスト環境)は、いろいろあります。
- Webブラウザー → Chrome、Firefox、Safariなど。
- Webサーバー → Node.js、Rhinoなど。
- Webアプリ → Google Apps Scriptなど。
- ソフトウェア → Adobe ExtendScript、Electron、Unity、Maxなど。
まとめ
JavaScriptが広く普及して、いろんなところで動くようになりました。
- JavaScriptの実行環境(ホスト環境)ごとに、用意されているホストオブジェクトが違うので、違いに注意!?
- (例)Webブラウザーには「windowオブジェクト」があるけど、Node.jsには「windowオブジェクト」がない等。
JavaScriptの勉強は、
- 最初に、ネイティブオブジェクト(全てのホスト環境で共通)
- 次に、ホストオブジェクト(ホスト環境ごとに違う)
の順番で練習すれば良いでしょうか?
開眼! JavaScript ―言語仕様から学ぶJavaScriptの本質
- 作者: Cody Lindley,和田祐一郎
- 出版社/メーカー: オライリージャパン
- 発売日: 2013/06/19
- メディア: 単行本(ソフトカバー)
- この商品を含むブログを見る