MENU

JavaScriptオブジェクト

【JavaScript】 エキゾチックなオブジェクトってなに?

更新日:2020/03/11

 

JavaScriptにはエキゾチックなオブジェクト(exotic object)というものが存在します。

 

何それ?

 

ということで調べてみました。

 

■お願い
去年ECMAScript2020を頑張って日本語訳しましたが、誰も見てくれません・・・
誰かみて!!
【JavaScript】 学習のためECMAScript2020を日本語訳してみました

Exotic Objectsとは

 

エキゾチックなオブジェクトは、JavaScriptの実質的な仕様によると次のようになっています。

 

4.3.7exotic object

object that does not have the default behaviour for one or more of the essential internal methods

 

NOTE    Any object that is not an ordinary object is an exotic object.
出典:ECMAScript® 2019 Language Specification

 

【訳】
1つまたは複数の重要な内部メソッドのデフォルトの動作を持たないオブジェクト

 

注    通常のオブジェクトではないオブジェクトは、エキゾチックなオブジェクトです。

 

通常のオブジェクトは、動作が仕様で定義されている内部的なメソッドを持っています。

 

このメソッドはオブジェクトとして不可欠です。

 

しかしなかには、メソッドが規定されていない動作をしたり、そもそも実装されていないオブジェクトがあります。

 

それがエキゾチックなオブジェクトのようです。

 

例えばArrayオブジェクトは、後述の[[DefineOwnProperty]]で独自の処理を行っています。
Stringオブジェクトは、いくつかの内部的なメソッドで独自の処理を行っています。

 

そのため、これらもエキゾチックなオブジェクトです。

 

 

 

ちなみに『exotic object』と対となるものは『ordinary object(普通のオブジェクト)』と紹介されています。

 

エキゾチックなオブジェクトは普通ではないオブジェクトなので、特殊なオブジェクトと訳している記事もあるようですね。

 

参考:【JavaScript】 ECMAScriptってなに?

重要な内部メソッド(the essential internal methods)とは

 

オブジェクトの重要な内部メソッド(essential internal methods)とはなんでしょうか?

 

toString()などのメソッドではなくて、プログラマレベルから呼び出しできないメソッドのようです。

 

6.1.7.2Object Internal Methods and Internal SlotsのTable5を見ると、次のようなものが挙げられていました。

 

■ [[GetPrototypeOf]]

 

オブジェクトの内部プロパティ[[Prototype]]を返すメソッドです。
[[Prototype]]は、プロトタイプへの参照がセットされています。

 

Object.getPrototypeOf()は、内部的にこのメソッドを呼び出しています。

 

参考:【JavaScript】 プロトタイプとは?prototypeプロパティはプロトタイプではない件について

 

■ [[SetPrototypeOf]]

 

オブジェクトの内部プロパティ[[Prototype]]に、プロトタイプへの参照をセットするメソッドです。

 

Object.setPrototypeOf()は、内部的にこのメソッドを呼び出しています。

 

■ [[IsExtensible]]

 

オブジェクトにプロパティを追加できるかどうかのフラグ。
一度falseにすると、trueに変更できない。

 

■ [[PreventExtensions]]

 

原文を翻訳すると『このオブジェクトに新しいプロパティを追加できるかどうかを制御します。』となっているが、呼び出すと『追加不可』に設定されるようです。

 

そして『追加不可』に設定されると、trueがリターンされます。

 

■ [[GetOwnProperty]]

 

指定した名前と対応するプロパティの値や書き込み可否などの情報をリターンします。

 

対応するプロパティがない場合は、undefinedをリターンします。

 

 

■ [[DefineOwnProperty]]

 

オブジェクトにプロパティを追加、または更新します。

 

■ [[HasProperty]]

 

指定した名前のプロパティがオブジェクトに存在してるかどうかをリターンします。

 

■ [[Get]]

 

指定した名前のプロパティが持っている値をリターンします。
対応するプロパティがない場合は、undefinedをリターンします。

 

■ [[Set]]

 

指定した名前のプロパティに値をセットします。
成功したらtrue、失敗したらfalseをリターンします。

 

■ [[Delete]]

 

指定した名前のプロパティをオブジェクトから削除します。
成功、または最初から存在していない場合true、削除できずプロパティが残っていたらfalseをリターンします。

 

■ [[OwnPropertyKeys]]

 

オブジェクトが持つプロパティのリストをリターンします。

まとめ

 

エキゾチックなオブジェクトかどうかはJavaScript内部の話なので、プログラムをする上では気にする必要はありません。

 

プログラマレベルでは、ほとんど役に立たない情報でしたね!

 

これも無駄記事になってしまうのだろうか…

記事の内容について

 

こんにちはけーちゃんです。
説明するのって難しいですね。


「なんか言ってることおかしくない?」
たぶん、こんなご意見あると思います。

裏付けを取りながら記事を作成していますが、僕の勘違いだったり、そもそも情報源の内容が間違えていたりで、正確でないことが多いと思います。

そんなときは、ご意見もらえたら嬉しいです。

ご意見はこちら。
https://note.affi-sapo-sv.com/info.php

【お願い】

お願い

■このページのURL


■このページのタイトル


■リンクタグ