訳の正確性を保証するものではありませんので必要に応じて原文であるEcma InternationalのECMA-262にある ECMA-262.pdf ( ECMA-262 5.1 Edition )を参照下さい。
訳:2012年04月 webzoit.net
Objectは、プロパティの集合です。 各プロパティは、それぞれ名前付きデータプロパティ、名前付きアクセサプロパティ、内部プロパティ等です。
名前付き(非内部)プロパティにおけるアクセスの種類には、get と put の2つがあり、それぞれ検索と関連付けに一致します。
属性(アトリビュート)は、名前付きプロパティの状態を定義し、説明する為にこの仕様内で使われます。 名前付きデータプロパティは、Table 5で列挙した属性を持つ名称と関連付けます。
Table 5 名前付きデータプロパティの属性 ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ 属性名 値領域 説明 ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ [[Value]] 任意のECMAScript言語の型 値はプロパティを読むことによって取得されます。 [[Writable]] Boolean もし、falseなら、実行中の[[Put]]を使って当該プロパティの[[Value]]属性を変更する為にECMAScriptコードによって試行しても成功しないでしょう。 [[Enumerable]] Boolean もし、trueなら、プロパティは、for-in 文( 12.6.4 参照)によって評価されます。 そうでない場合には、プロパティはnon-enumerable(列挙不可)であると言われます。 [[Configurable]] Boolean もし、falseなら、プロパティを削除しようとしたり、アクセサプロパティにする為にプロパティを変更したり、その([[Value]]ではない)属性を変更しようとしたりすると失敗するでしょう。 ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
名前付きアクセサプロパティは、Table 6で列挙した属性を持つ名称と関連付けます。
Table 6 名前付きアクセサプロパティの属性 ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 属性名 値領域 説明 ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- [[Get]] Object または Undefined もし、その値が、Objectなら、それは関数Objectにしなければいけません。 その関数の内部メソッド[[Call]]( 8.6.2 )は、そのプロパティのgetアクセスが実行されるごとに当該プロパティ値を返す為に空の引数リストを伴って呼び出されます。 [[Set]] Object または Undefined もし、その値が、Objectなら、それは関数Objectにしなければいけません。 その関数の内部メソッド[[Call]]( 8.6.2 )は、そのプロパティのsetアクセスが実行されるごとに、その全ての引数として関連付けた値を含んだ引数リストを伴って呼び出されます。 任意のプロパティの内部メソッド[[Set]]の効果は、要求はされないものの、当該プロパティの[[Get]]内部メソッドを順次呼び出すことによって返した値について効果を持ちます。 [[Enumerable]] Boolean もし、trueなら、そのプロパティは、 for-in文( 12.6.4 参照)によって評価されます。 そうでない場合には、そのプロパティは、non-enumerable(列挙不可)であると言われます。 [[Configurable]] Boolean もし、falseなら、そのプロパティを削除しようとしたり、任意のデータプロパティにする為に当該プロパティを変更しようとしたり、その属性を変更しようとすると失敗するでしょう。 -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
もし、属性の値が、名前付きプロパティにおけるこの仕様によって明示的に書かれていない場合には、既定値は、Table 7 で定義したものが使用されます。
Table 7 既定の属性値 ---------------------------------- 属性名 既定値 ---------------------------------- [[Value]] undefined [[Get]] undefined [[Set]] undefined [[Writable]] false [[Enumerable]] false [[Configurable]] false ----------------------------------
この仕様は、オブジェクトの値のセマンティクスを定義する為に様々な内部プロパティを使います。 これらの内部プロパティは、ECMAScript言語の一部ではありません。 それらは、単に解説目的の為に、この仕様によって定義されているだけです。 ECMAScriptの実装は、ここで書かれた方法の中で内部プロパティを生成、操作するかのようにふるまわなければいけません。 内部プロパティの名称は、二重角ブラケット[[ ]]で括られます。 アルゴリズムがオブジェクトの内部プロパティを利用し、当該オブジェクトが内部プロパティを示す実装をしない場合には、TypeErrorという例外が投げられ(スローされ)ます。 内部プロパティの要約である Table 8 は、全てのECMAScriptオブジェクトに適用されるこの仕様によって使われます。 内部プロパティの要約である Table 9 は、一部のECMAScriptオブジェクトに適用される場合に限り、この仕様によって使われます。 これらの表にある説明は、ネイティブなECMAScriptオブジェクトの特定の種類においてこの文書内で特に述べない限りは、ネイティブなECMAScriptオブジェクトにおけるこれらの動作を示します。 ホストオブジェクトは、この文書内で述べた指定するホストオブジェクトの制約を伴う構成と同じである限り、任意の実装依存の振る舞いを伴うこれらの内部プロパティをサポートする場合があります。 次の表の"値の型領域 / Value Type Domain"という列は、内部プロパティ付きで関連付けた値の型を定義します。 型名は、次に付加される名称によって第8項の中で定義した型を参照します。 "any"は、任意のECMAScript言語の型になる場合がある値を意味します。 "primitive"は、Undefined、Null、Boolean、String、Number(という型)を意味します。 "SpecOp"は、内部プロパティが、内部メソッドであり、抽象操作仕様によって先行定義した実装であることを意味します。 "SpecOp"は、パラメータ名を説明したリストによって続けられます。 もし、パラメータ名が型名と同じである場合には、名称はパラメータの型として説明されます。 もし、"SpecOp"が、値を返す場合には、そのパラメータリストは、記号"→"によって返した値の型が続けられます。
Table 8 全てのオブジェクトに共通する内部プロパティ --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 内部プロパティ 値の型領域/Value Type Domain 概要 --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- [[Prototype]] Object または、 Null 当該オブジェクトにおけるプロパティ [[Class]] String String値が示す仕様はオブジェクトという分類で定義しました。 [[Extensible]] Boolean もし、trueなら、そのプロパティ自身がオブジェクトに追加される場合があります。 [[Get]] SpecOp (propertyName) → any 名前付きプロパティの値を返します。 [[GetOwnProperty]] SpecOp (propertyName) →Undefined or Property Descriptor 当該オブジェクトのプロパティ自体に名前を付けるプロパティ記述子(Property Descriptor)、もし、なければ未定義(undefined)を返します。 [[GetProperty]] SpecOp (propertyName) →Undefined or Property Descriptor 当該オブジェクトの名前付きプロパティの完全形のプロパティ記述子(Property Descriptor)、もし、なければ未定義(undefined)を返します。 [[Put]] SpecOp (propertyName, any, Boolean) 2番めのパラメータの値に記述済み名前付きプロパティを設定します。 フラグは、エラー処理を制御します。 [[CanPut]] SpecOp (propertyName) → Boolean 実行可能なプロパティ名(PropertyName)を伴う[[Put]]操作か否かを示すBoolean値を返します。 [[HasProperty]] SpecOp (propertyName) → Boolean 与えられた名称のプロパティを既に持っているオブジェクトか否かを示すBoolean値を返します。 [[Delete]] SpecOp (propertyName, Boolean) → Boolean 当該オブジェクトから記述済みの名前付きの自身のプロパティを削除します。 フラグはエラー処理を制御します。 [[DefaultValue]] SpecOp (Hint) → primitive Hintは文字列です。当該オブジェクトにおける既定値を返します。 [[DefineOwnProperty]] SpecOp (propertyName, PropertyDescriptor, Boolean) → Boolean プロパティ記述子(Property Descriptor)によって説明した状態を持つ名前付きプロパティそれ自体を生成、または変更します。 フラグはエラー処理を制御します。 ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
(ホストオブジェクトを含む)各オブジェクトは、Table 8に列挙された内部プロパティの全てを実装しなければいけません。 しかしながら、[[DefaultValue]]内部メソッドは、一部のオブジェクトにおいては、単にTypeError例外を投げる(スローする)だけという場合もあります。 全てのオブジェクトは、[[Prototype]]と呼ばれる内部プロパティを持ちます。 このプロパティの値は、nullだったり、オブジェクトだったりし、実装している継承において使用されます。 ネイティブオブジェクトか否かに関わらず、その実装に依存する[[Prototype]]としてホストオブジェクトを持つことが可能です。 各[[Prototype]]チェーンは、有限の長さにしなければいけません。 (あるオブジェクトから始まるということは、最終的にはnull値に先行しなければいけない[[Prototype]]内部プロパティに再帰的にアクセスするという事です。) [[Prototype]]オブジェクトの名前付きデータプロパティは、putアクセスではなく、getアクセスの目的において(子オブジェクトのプロパティとして表示され、)継承されます。 名前付きアクセサプロパティは、getアクセスとputアクセスの両方において継承されます。 各ECMAScriptオブジェクトは、オブジェクトに追加される場合がある名前付きプロパティか否かを操作するBoolean値である[[Extensible]]内部プロパティを持ちます。 もし、[[Extensible]]内部プロパティの値が、falseである場合には、オプションの名前付きプロパティは、当該オブジェクトに追加されない場合があります。 追記すると、もし、[[Extensible]]が、falseである場合には、当該オブジェクトの[[Class]]と[[Prototype]]内部プロパティの値が、修正されない場合があります。 一度[[Extensible]]内部プロパティの値が、falseに設定されたらtrueに変更されることはないかもしれません。 [注釈] この仕様が定義するオブジェクトの[[Class]]や[[Prototype]]内部プロパティを修正する為のプログラムや、[[Extensible]]の値をfalseからtrueに変更する為のプログラムを許可するECMAScript言語の演算子や組み込み関数は、一切ありません。 [[Class]]、[[Prototype]]、[[Extensible]]を修正する実装仕様拡張は、先行する段落内に定義した不変条件に反してはいけません。 [[Class]]内部プロパティの値は、組み込みオブジェクトの種類ごとにこの仕様によって定義されます。 ホストオブジェクトの[[Class]]内部プロパティの値は、
Arguments Array Boolean Date Error Function JSON Math Number Object RegExp String
であるものを除く一部の文字列値になる場合があります。 [[Class]]内部プロパティの値は、異なるオブジェクトの種類を識別する為に内部的に使用されます。 注釈としては、この仕様は、 Object.prototype.toString ( 15.2.4.2 参照)を通す場合を除いて値にアクセスする為のプログラムにとって意味あるものは何も提供しません。 特記のない限り、ネイティブなECMAScriptオブジェクトの一般的な内部メソッドは、8.12 で説明したように振る舞います。 Array(配列)オブジェクトは、[[DefineOwnProperty]]内部メソッド( 15.4.5.1 参照)の実装と多少異なっており、Stringオブジェクトは、[[GetOwnProperty]]内部メソッド( 15.5.5.2参照)の実装と多少異なっています。 Argumentsオブジェクト(10.6)は、[[Get]]、[[GetOwnProperty]]、[[DefineOwnProperty]]、[[Delete]]の異なる実装を持ちます。 Functionオブジェクト(15.3)は、[[Get]]の実装と異なります。 ホストオブジェクトは、他に特段の記述がない限り、任意の方法でこれら内部メソッドを実装する場合があります。 例えば、一つの可能性としては、特定のホストオブジェクトにおける[[Get]]と[[Put]]は、まさにフェッチをし、常にfalseを生成する[[HasProperty]]ではなく、(その都度)プロパティ値を保存します。 しかしながら、ホストオブジェクトの内部プロパティの操作を記述した場合には、実装によってサポートされず、操作は、試行した際にTypeErrorを投げなければいけません。 ホストオブジェクトの[[GetOwnProperty]]内部メソッドは、ホストオブジェクトのプロパティごとに続く不変式と一致しなければいけません。
ホストオブジェクトの[[DefineOwnProperty]]内部メソッドは、もし、そのホストオブジェクトの[[Extensible]]内部プロパティが、falseになるようにECMAScriptコードによって監視されている場合には、ホストオブジェクトに新しいプロパティを追加することを許可してはいけません。 もし、そのホストオブジェクトの[[Extensible]]内部プロパティが、falseになるようにECMAScriptコードによって監視されている場合には、その後trueにしていはいけません。
Table 9 一部のオブジェクト定義用の内部プロパティ ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ 内部プロパティ 値型領域 説明 ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ [[PrimitiveValue]] primitive 当該オブジェクトに紐づく内部状態情報。 標準組み込みECMAScriptオブジェクトとしてBoolean、Date、Number、String オブジェクトだけが[[PrimitiveValue]]を実装。 [[Construct]] SpecOp(a List of any) → Object オブジェクトを生成。 新しい演算子経由で実行。 SpecOpへの引数は、新しい演算子の為に渡した引数。 オブジェクトはコンストラクタと呼ばれる当該内部メソッドを実装。 [[Call]] SpecOp(any, a List of any) → any or Reference 当該オブジェクトと紐づく実行コード。 関数呼び出し式(ファンクションコール)経由で実行。 SpecOpへの引数は、当該オブジェクトと関数呼び出し式の為に渡した引数を含むリスト。 当該内部メソッドを実装するオブジェクトは呼び出し可能。 ホストオブジェクトであるオブジェクトに限っては参照値を返す場合がある。 [[HasInstance]] SpecOp(any) → Boolean this オブジェクトによって構築されたObjectであるかのような引数か否かを示すBoolean値を返す。 標準組み込みECMAScriptオブジェクトとしてFunctionオブジェクトのみ[[HasInstance]]を実装。 [[Scope]] Lexical Environment Functionオブジェクト内で環境を定義する語彙的な環境が実行される。 標準組み込みECMAScriptオブジェクトとしてFunctionオブジェクトのみ[[Scope]]を実装。 [[FormalParameters]] List of Strings Functionの正規のパラメータリスト(FormalParameterList)であると識別する文字列を含む空の可能性もあるリスト。 標準組み込みECMAScriptオブジェクトとしてFunctionオブジェクトのみ[[FormalParameterList]]を実装。 [[Code]] ECMAScript code 関数のECMAScriptコード。 標準組み込みECMAScriptオブジェクトとして唯一Functionオブジェクトのみ[[Code]]を実装。 [[TargetFunction]] Object 標準組み込みFunction.prototype.bindメソッドを利用することによって生成した関数オブジェクトとしての対象関数。 Function.prototype.bindを使用して生成したECMAScriptオブジェクトに限っては、[[TargetFunction]]内部プロパティを持つ。 [[BoundThis]] any 標準組み込みFunction.prototype.bindメソッドを使って生成した関数オブジェクトの当該値を事前に関連付け(バインド)。 Function.prototype.bindを使用して生成したECMAScriptオブジェクトに限っては、[[BoundThis]]内部プロパティを持つ。 [[BoundArguments]] List of any 標準組み込みFunction.prototype.bindメソッドを使って生成した関数オブジェクトの引数の値を事前に関連付け(バインド)。 Function.prototype.bindを使用して生成したECMAScriptオブジェクトに限っては、[[BoundArguments]]内部プロパティを持つ。 [[Match]] SpecOp(String, index) → MatchResult 正規表現マッチについてテストし、MatchResult値( 15.10.2.1 参照)を返す。 標準組み込みECMAScriptオブジェクトとしてRegExpオブジェクトのみ[[Match]]を実装。 [[ParameterMap]] Object 引数オブジェクト( 10.6 参照)のプロパティと関連付けした関数の正規のパラメータ間におけるマッピングを提供。 引数オブジェクトであるECMAScriptオブジェクトのみ[[ParameterMap]]内部プロパティを持つ。 ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------