【JavaScript】組み込みオブジェクトのインスタンスの正式名称はあるのか?
更新日:2024/02/26
JavaScriptの配列はArrayオブジェクトのインスタンスです。
関数はFunctionオブジェクトのインスタンスです。
記事中でこれらを紹介するとき配列オブジェクトや関数オブジェクトなどの名称を使うことが多いですが、Arrayオブジェクト等と混同することがあります。
では、JavaScriptの仕様ではどのような名称で定義されされているのが調べてみました。
コンストラクターとインスタンス
そもそもの話ですが、前提条件として組み込みオブジェクトのうちコンストラクター機能があるものは、○○コンストラクターと呼んでいます。
そして、コンストラクターが生成したインスタンスを、○○オブジェクトと呼んでいます。
例えばFuncコンストラクターが生成したインスタンスは Funcオブジェクトです。
同様にArrayコンストラクターのインスタンスは、Arrayオブジェクトです。
組み込みオブジェクトのArrayはオブジェクトなんだから、Arrayオブジェクトと呼んでも間違いないのですが、コンストラクターがからむとインスタンスもArrayオブジェクトと呼ばれていて、事情を理解していないと混乱しますね。
通常のオブジェクトとエキゾチックなオブジェクト
コンストラクターが生成も含めて、JavaScriptのほとんどのオブジェクトは通常のオブジェクト(Ordinary Object)と呼ばれています。
そして、組み込みオブジェクトのインスタンスのうち、いくつかはエキゾチックなオブジェクト(Exotic Object)に分類されます。
Exoticは日本語だと異国情緒とか珍しいなどの意味合いがありますが、ここでは"通常と異なる"というニュアンスですね。
オブジェクトはプログラムコードからアクセスできないプロパティ(仕様ではスロット)をいくつか持っています。
例えばプロパティに値をセットするときに呼び出される[[Set]]スロット、プロパティから値を取得するときに呼び出される[[Get]]スロットなどです。
各スロットがどのような処理を行うかは、通常のオブジェクトに実装すべきロジックとして決められています。
しかし一部のオブジェクトは決められたものとは異なる処理が実行されます。
このようなオブジェクトを、エキゾチックなオブジェクトと呼んでいます。
また、一部のオブジェクトは通常のオブジェクトとして定義されていないスロットを、追加で持っています。
このようなオブジェクトでも、他の実装すべきロジックが変更されていなければ通常のオブジェクトです。
エキゾチックなオブジェクトの種類
JavaScriptには様々な組み込みオブジェクトがありますが、エキゾチックなオブジェクトはそれほど多くはありません。
WebAPIやNode.jsのモジュールなどは組み込みオブジェクトではありません。
Arrayエキゾチックオブジェクト
Arrayエキゾチックオブジェクト(Array Exotic Objects)は、配列リテラルなどで生成されるオブジェクトです。
頻繁に使用されるので馴染み深いオブジェクトですね。
このオブジェクトは、数値プロパティが追加されると、lengthプロパティの値を調節します。
Stringエキゾチックオブジェクト
Stringエキゾチックオブジェクト(String Exotic Objects)は、馴染み深いような気がします。
しかし、このオブジェクトを変数にセットして運用するような場面は、ほとんどありません。
Stringエキゾチックオブジェクトは文字列プリミティブからStringオブジェクト(エキゾチックではない)のメソッドを呼び出すための橋渡し的なオブジェクト、いわゆるラッパーオブジェクトとして使用されます。
Stringエキゾチックオブジェクトは[[StringData]]スロットに文字列データがセットされます。
このスロットの値は、後から変更できません。
また数値プロパティで値を取得すると、[[StringData]]スロットの文字列から対応するコードユニット位置の文字を返します。
バインドされた関数エキゾチックオブジェクト
バインドされた関数エキゾチックオブジェクト(Bound Function Exotic Objects)は、Functionオブジェクトのbindメソッドで生成されるオブジェクトです。
元となる関数(Functionオブジェクト)が[[BoundTargetFunction]]スロットにセットされます。
this値は[[BoundThis]]に、引数は[[BoundArguments]]にセットされます。
そして関数実行時に、[[BoundTargetFunction]]スロットにセットされている関数が実行されます。
整数インデックスエキゾチックオブジェクト
整数インデックスエキゾチックオブジェクト(Integer-Indexed Exotic Objects)は、Uint8Array等のTypedArrayで生成されるオブジェクトです。
固有の内部スロットとして[[ViewedArrayBuffer]]、[[ArrayLength]]、[[ByteOffset]]、[[ContentType]]、[[TypedArrayName]]があります。
数値インデックスでアクセスされると、[[ViewedArrayBuffer]]スロットにセットされたArrayBufferから値の取得等をおこないます。
引数エキゾチックオブジェクト
引数エキゾチックオブジェクト(Arguments Exotic Objects)は、非strictモードのとき関数内部でargumentsという名前で生成されます。
strictモードのときも同名のオブジェクトが生成されますが、こちらはエキゾチックオブジェクトではありません。
引数エキゾチックオブジェクトは、関数が受け取った引数が配列としてセットされます。
そして引数またはエキゾチックオブジェクトの値を変更すると、連動して他方の値が変化します。
プロキシオブジェクト
プロキシオブジェクト(Proxy Object)は、Proxyコンストラクタ関数が生成するオブジェクトです。
ターゲットとなるオブジェクトの動作をトラップするために、内部スロットの処理を大幅に変更しています。
モジュールネームスペースエキゾチックオブジェクト
モジュールネームスペースエキゾチックオブジェクト(Module Namespace Exotic Objects)は、モジュールからインポートしたオブジェクト等を管理するオブジェクトです。
ほとんど意識する必要が無いですね。
イミュータブルプロトタイプエキゾチックオブジェクト
イミュータブル(不変)プロトタイプエキゾチックオブジェクトは一度初期化すると変更されないオブジェクトです。
こちらもほとんど意識する必要が無いです。
関数オブジェクトの正式名称
関数オブジェクトは通常のオブジェクトです。
[[Call]]と[[Construct]]という内部スロットが追加されていますが、その他は通常のオブジェクトと同じです。
ただし、基本的な機能を実装していればエキゾチックなオブジェクトにしてもOKということになっています。
そのため正式な名称は特にありません。
更新日:2024/02/26
関連記事
スポンサーリンク
記事の内容について
こんにちはけーちゃんです。
説明するのって難しいですね。
「なんか言ってることおかしくない?」
たぶん、こんなご意見あると思います。
裏付けを取りながら記事を作成していますが、僕の勘違いだったり、そもそも情報源の内容が間違えていたりで、正確でないことが多いと思います。
そんなときは、ご意見もらえたら嬉しいです。
掲載コードについては事前に動作確認をしていますが、貼り付け後に体裁を整えるなどをした結果動作しないものになっていることがあります。
生暖かい視線でスルーするか、ご指摘ください。
ご意見、ご指摘はこちら。
https://note.affi-sapo-sv.com/info.php
このサイトは、リンクフリーです。大歓迎です。