9.1 通常のオブジェクトの内部メソッドと内部スロット(Ordinary Object Internal Methods and Internal Slots)
すべての通常のオブジェクトには、[[Prototype]]という内部スロットがあります。 この内部スロットの値はnullまたはオブジェクトであり、継承の実装に使用されます。 [[Prototype]]オブジェクトのデータプロパティは、取得アクセスは継承されます(子オブジェクトのプロパティとして表示されます)が、セットアクセスは継承されません。 アクセサプロパティは、取得アクセスとセットアクセスの両方で継承されます。
すべての通常のオブジェクトにはブール値[[Extensible]]内部スロットがあり、6.1.7.3で指定された拡張性関連の内部メソッドの不変条件を満たすために使用されます。 つまり、オブジェクトの[[Extensible]]内部スロットの値がfalseに設定されると、オブジェクトにプロパティを追加したり、オブジェクトの[[Prototype]]内部スロットの値を変更したり、[[Extensible]]の値をtrueに変更できなくなります。
次のアルゴリズムの説明では、O が通常のオブジェクト、P がプロパティキー値、V がECMAScript言語値、および Desc がプロパティ記述子レコードであると想定しています。
各通常のオブジェクトの内部メソッドは、同じ名前の抽象操作に委譲します。 同じ名前の抽象操作が別の内部メソッドに依存している場合、同じ名前の抽象操作を直接呼び出すのではなく、O で内部メソッドが呼び出されます。 これらのセマンティクスは、通常のオブジェクトの内部メソッドが適用されたときに、エキゾチックオブジェクトがオーバーライドされた内部メソッドを確実に呼び出すようにします。
9.1.1 [[GetPrototypeOf]] ( )
O の[[GetPrototypeOf]]内部メソッドが呼び出されると、次の手順が実行されます。
- ! OrdinaryGetPrototypeOf(O)を返す
9.1.1.1 OrdinaryGetPrototypeOf ( O )
抽象操作OrdinaryGetPrototypeOfがオブジェクトOで呼び出されると、次の手順が実行されます。
- O.[[Prototype]]を返す
9.1.2 [[SetPrototypeOf]] ( V )
引数 V を指定して O の[[SetPrototypeOf]]内部メソッドが呼び出されると、次の手順が実行されます。
- ! OrdinarySetPrototypeOf(O, V)を返す
9.1.2.1 OrdinarySetPrototypeOf ( O, V )
抽象演算OrdinarySetPrototypeOfがオブジェクト O と値 V で呼び出されると、次の手順が実行されます。
9.1.3 [[IsExtensible]] ( )
O の[[IsExtensible]]内部メソッドが呼び出されると、次の手順が実行されます。
- ! OrdinaryIsExtensible(O)を返す
9.1.3.1 OrdinaryIsExtensible ( O )
抽象操作OrdinaryIsExtensibleがオブジェクト O で呼び出されると、次の手順が実行されます。
- O.[[Extensible]]を返す
9.1.4 [[PreventExtensions]] ( )
Oの[[PreventExtensions]]内部メソッドが呼び出されると、次の手順が実行されます。
- ! OrdinaryPreventExtensions(O)を返す
9.1.4.1 OrdinaryPreventExtensions ( O )
抽象操作OrdinaryPreventExtensionsがオブジェクト O で呼び出されると、次の手順が実行されます。
- false を O.[[Extensible]] にセットする
- true を返す
9.1.5 [[GetOwnProperty]] ( P )
O の[[GetOwnProperty]]内部メソッドがプロパティキーP で呼び出されると、次の手順が実行されます。
- ! OrdinaryGetOwnProperty(O, P)を返す
9.1.5.1 OrdinaryGetOwnProperty ( O, P )
抽象操作OrdinaryGetOwnPropertyがオブジェクトO とプロパティキーP で呼び出されると、次の手順が実行されます。
- Assert: IsPropertyKey(P) は true
- O に キーP に対応する 所有プロパティ がないなら、undefined を返す
- フィールドなしで新規作成したプロパティ記述子 を D とする
- キーP に対応する O の 所有プロパティ を X とする
- X が データプロパティ なら
- X の [[Value]] 属性値 を D.[[Value]] にセットする
- X の [[Writable]] 属性値 を D.[[Writable]] にセットする
- 5.と異なるなら
- X の [[Enumerable]] 属性値 を D.[[Enumerable]] にセットする
- X の [[Configurable]] 属性値 を D.[[Configurable]] にセットする
- Dを返す
9.1.6 [[DefineOwnProperty]] ( P, Desc )
O の[[DefineOwnProperty]]内部メソッドがプロパティキーP とプロパティ記述子Desc で呼び出されると、次の手順が実行されます。
- ? OrdinaryDefineOwnProperty(O, P, Desc)を返す
9.1.6.1 OrdinaryDefineOwnProperty ( O, P, Desc )
抽象操作OrdinaryDefineOwnPropertyがオブジェクトO、プロパティキーP、およびプロパティ記述子Desc で呼び出されると、次の手順が実行されます。
- ? O.[[GetOwnProperty]](P) を current とする
- ? IsExtensible(O) を extensible とする
- ValidateAndApplyPropertyDescriptor(O, P, extensible, Desc, current)を返す
9.1.6.2 IsCompatiblePropertyDescriptor ( Extensible, Desc, Current )
抽象演算IsCompatiblePropertyDescriptorがブール値Extensible、プロパティ記述子Desc、およびCurrent で呼び出されると、次の手順が実行されます。
- ValidateAndApplyPropertyDescriptor(undefined, undefined, Extensible, Desc, Current)を返す
9.1.6.3 ValidateAndApplyPropertyDescriptor ( O, P, extensible, Desc, current )
抽象操作ValidateAndApplyPropertyDescriptorがオブジェクトO、プロパティキーP、ブール値extensible、プロパティ記述子Desc、およびcurrentで呼び出されると、次の手順が実行されます。
- Assert: O が undefined でないなら IsPropertyKey(P) は true
- current が undefined なら、
- extensible が false なら、 false を返す
- Assert: extensible は true
- IsGenericDescriptor(Desc) が true または IsDataDescriptor(Desc) が true なら
- c.でないなら
- Assert: ! IsAccessorDescriptor(Desc) は true
- O が undefined でないなら、O に P という名前の アクセサプロパティ を作成する。Desc を元に、作成したプロパティの [[Get]]、[[Set]]、[[Enumerable]]、[[Configurable]] 属性をセットする。 Desc に目的のフィールドが存在しないなら、デフォルト値(表5)をセットする
- true を返す
- Desc にフィールドがないなら、true を返す
- current.[[Configurable]] が false なら、
- ! IsGenericDescriptor(Desc) が true なら、
- NOTE: これ以上の検証は不要
- 5.でなく、 ! SameValue(! IsDataDescriptor(current), ! IsDataDescriptor(Desc)) が false なら
- current.[[Configurable]] が false なら、 false を返す
- IsDataDescriptor(current) が true なら、
- b.でなければ
- 5. 6.でなく IsDataDescriptor(current) と IsDataDescriptor(Desc) が true なら、
- current.[[Configurable]] が false で current.[[Writable]] が false なら、
- Desc.[[Writable]] が存在していて Desc.[[Writable]] が true なら、 false を返す
- Desc.[[Value]] が存在していて SameValue(Desc.[[Value]], current.[[Value]]) が false なら、 false を返す
- true を返す
- current.[[Configurable]] が false で current.[[Writable]] が false なら、
- 5. 6. 7.でないなら
- Assert: ! IsAccessorDescriptor(current) と ! IsAccessorDescriptor(Desc) は true
- current.[[Configurable]] が false なら、
- O が undefined でないなら、
- Descの存在している各フィールドを、O の P という名前のプロパティの対応する属性フィールドにセットする
- true を返す
9.1.7 [[HasProperty]] ( P )
O の[[HasProperty]]内部メソッドがプロパティキーP で呼び出されると、次の手順が実行されます。
- ? OrdinaryHasProperty(O, P)を返す
9.1.7.1 OrdinaryHasProperty ( O, P )
抽象演算OrdinaryHasPropertyがオブジェクトOとプロパティキーPで呼び出されると、次の手順が実行されます。
- Assert: IsPropertyKey(P) は true
- ? O.[[GetOwnProperty]](P) を hasOwn とする
- hasOwn が undefined でないなら、 true を返す
- ? O.[[GetPrototypeOf]]() を parent とする
- parent が null でないなら、
- ? parent.[[HasProperty]](P)を返す
- false を返す
9.1.8 [[Get]] ( P, Receiver )
O の[[Get]]内部メソッドがプロパティキーPおよびECMAScript言語値Receiverで呼び出されると、次の手順が実行されます。
- ? OrdinaryGet(O, P, Receiver)を返す
9.1.8.1 OrdinaryGet ( O, P, Receiver )
抽象操作OrdinaryGetがオブジェクトO、プロパティキーP、ECMAScript言語値Receiverで呼び出されると、次の手順が実行されます。
- Assert: IsPropertyKey(P) は true
- ? O.[[GetOwnProperty]](P) を desc とする
- desc が undefined なら、
- IsDataDescriptor(desc) が true なら、 desc.[[Value]]を返す
- Assert: IsAccessorDescriptor(desc) は true
- desc.[[Get]] を getter とする
- getter が undefined なら、 undefined を返す
- ? Call(getter, Receiver)を返す
9.1.9 [[Set]] ( P, V, Receiver )
Oの[[Set]]内部メソッドがプロパティキーP、値V、およびECMAScript言語値Receiverで呼び出されると、次の手順が実行されます。
- ? OrdinarySet(O, P, V, Receiver)を返す
9.1.9.1 OrdinarySet ( O, P, V, Receiver )
抽象操作OrdinarySetがオブジェクトO、プロパティキーP、値V、およびECMAScript言語値Receiverで呼び出されると、次の手順が実行されます。
- Assert: IsPropertyKey(P) は true
- ? O.[[GetOwnProperty]](P) を ownDesc とする
- OrdinarySetWithOwnDescriptor(O, P, V, Receiver, ownDesc)を返す
9.1.9.2 OrdinarySetWithOwnDescriptor ( O, P, V, Receiver, ownDesc )
抽象演算OrdinarySetWithOwnDescriptorが、オブジェクトO、プロパティキーP、値V、ECMAScript言語値Receiver、およびプロパティ記述子(またはundefined)のownDescで呼び出されると、次の手順が実行されます。
- Assert: IsPropertyKey(P) は true
- ownDesc が undefined なら、
- ? O.[[GetPrototypeOf]]() を parent とする
- parent が null でないなら、
- ? parent.[[Set]](P, V, Receiver)を返す
- b. でないなら
- PropertyDescriptor型{ [[Value]]: undefined, [[Writable]]: true, [[Enumerable]]: true, [[Configurable]]: true } を ownDesc にセットする
- IsDataDescriptor(ownDesc) が true なら、
- ownDesc.[[Writable]] が false なら、false を返す
- Type(Receiver) Object型でないなら、 false を返す
- ? Receiver.[[GetOwnProperty]](P) を existingDescriptor とする
- existingDescriptor が undefined なら、
- IsAccessorDescriptor(existingDescriptor) が true なら、false を返す
- existingDescriptor.[[Writable]] が false なら、false を返す
- PropertyDescriptor型 { [[Value]]: V } を valueDesc とする
- ? Receiver.[[DefineOwnProperty]](P, valueDesc)を返す
- d. でないなら
- Assert: ReceiverにはプロパティPがない
- ? CreateDataProperty(Receiver, P, V)を返す
- Assert: IsAccessorDescriptor(ownDesc) は true
- ownDesc.[[Set]] を setter とする
- setter が undefined なら、false を返す
- ?Call(setter, Receiver, « V »)を実行
- true を返す
9.1.10 [[Delete]] ( P )
プロパティキーPを使用してOの[[Delete]]内部メソッドが呼び出されると、次の手順が実行されます。
- ? OrdinaryDelete(O, P)を返す
9.1.10.1 OrdinaryDelete ( O, P )
抽象操作OrdinaryDeleteがオブジェクトOとプロパティキーPで呼び出されると、次の手順が実行されます。
- Assert: IsPropertyKey(P) は true
- ? O.[[GetOwnProperty]](P) を desc とする
- desc が undefined なら、true を返す
- desc.[[Configurable]] が true なら、
- OからPという名前の独自プロパティを削除する
- true を返す.
- false を返す.
9.1.11 [[OwnPropertyKeys]] ( )
Oの[[OwnPropertyKeys]]内部メソッドが呼び出されると、次の手順が実行されます。
- ! OrdinaryOwnPropertyKeys(O)を返す
9.1.11.1 OrdinaryOwnPropertyKeys ( O )
抽象操作OrdinaryOwnPropertyKeysがオブジェクトOで呼び出されると、次の手順が実行されます。
9.1.12 OrdinaryObjectCreate ( proto [ , additionalInternalSlotsList ] )
オブジェクトproto(またはnull)を持つ抽象オペレーションOrdinaryObjectCreateは、ランタイムで新しい通常のオブジェクトを作成します。 オプションの引数additionalInternalSlotsListは、[[Prototype]]および[[Extensible]]の他に、オブジェクトの一部として追加する内部スロットの名前のリストです。 リストが提供されない場合、新しい空のリストが使用されます。 この抽象操作は次の手順を実行します。
- « [[Prototype]], [[Extensible]] » を internalSlotsList とする
- additionalInternalSlotsList が存在するなら、 各要素をinternalSlotsListに追加する
- ! MakeBasicObject(internalSlotsList) を O とする
- proto を O.[[Prototype]] にセットする
- Oを返す
9.1.13 OrdinaryCreateFromConstructor ( constructor, intrinsicDefaultProto [ , internalSlotsList ] )
抽象オペレーションOrdinaryCreateFromConstructorは、constructorに"prototype"プロパティが存在する場合、そのプロパティ値が[[Prototype]]に使用された通常のオブジェクトを作成します。 それ以外の場合、[[Prototype]]には、intrinicDefaultProtoで指定された組み込みオブジェクトが使用されます。 オプションのinternalSlotsListは、オブジェクトの一部として追加する内部スロット名のリストです。 リストが提供されない場合、新しい空のリストが使用されます。 この抽象操作は次の手順を実行します。
- Assert: intrinsicDefaultProto はString値で、この仕様の組み込みオブジェクトの名前。 対応するオブジェクトは、オブジェクトの[[Prototype]]値として使用するための組み込み関数である必要がある。
- ? GetPrototypeFromConstructor(constructor, intrinsicDefaultProto) を proto とする
- OrdinaryObjectCreate(proto, internalSlotsList)を返す
9.1.14 GetPrototypeFromConstructor ( constructor, intrinsicDefaultProto )
抽象操作GetPrototypeFromConstructorは、constructorに対応するオブジェクトを作成するために必要な[[Prototype]]値を取得します。 constructorに"prototype"プロパティが存在する場合、そのプロパティが使用されます。 それ以外の場合、[[Prototype]]は、intrinicDefaultProtoで指定された組み込みオブジェクトが使用されます。 この抽象操作は次の手順を実行します。
- Assert:intrinsicDefaultProto はString値で、この仕様の組み込みオブジェクトの名前。 対応するオブジェクトは、オブジェクトの[[Prototype]]値として使用するための組み込み関数である必要がある。
- Assert: IsCallable(constructor) は true
- ? Get(constructor, "prototype") を proto とする
- Type(proto) が Object型でないなら、
- ? GetFunctionRealm(constructor) を realm とする
- intrinsicDefaultProtoという名前のrealmの組み込みオブジェクト を proto にセットする
- protoを返す
9.1.15 RequireInternalSlot ( O, internalSlot )
抽象演算RequireInternalSlotは、オブジェクトOが、指定された内部スロットを持たないとき、例外をスローします。
- Type(O) が Object型でないなら、 TypeError例外をスローする.
- O が internalSlotという内部スロットを持っていないなら、 TypeError例外をスローする
9.2 ECMAScript関数オブジェクト(ECMAScript Function Objects)
strict関数
非strict関数
ECMAScript関数オブジェクトは、レキシカル環境で閉じられパラメーター化されたECMAScriptコードをカプセル化し、そのコードの動的評価をサポートします。 ECMAScript関数オブジェクトは通常のオブジェクトであり、他の通常のオブジェクトと同じ内部スロットと内部メソッドを持っています。 ECMAScript関数オブジェクトのコードは、strict(厳密)モードコード(10.2.1)または非strictコードのいずれかです。 strictモードのコードであるECMAScript関数オブジェクトは、strict関数と呼ばれます。 strictモードのコードではないコードは、非strict関数と呼ばれます。
[[Extensible]]と[[Prototype]]に加えて、ECMAScript関数オブジェクトには、表27に示す内部スロットがあります。
内部スロット | 型 | 内容 |
---|---|---|
[[Environment]] | レキシカル環境 | 関数で閉じられたレキシカル環境。 関数内のコードを評価するときに外部環境として使用されます。 |
[[FormalParameters]] | パースノード | 関数の仮パラメーターリストを定義するソーステキストのルートパースノード。 |
[[ECMAScriptCode]] | パースノード | 関数の本体を定義するソーステキストのルートパースノード。 |
[[ConstructorKind]] | base | derived | 関数が派生クラスコンストラクターかどうか。 |
[[Realm]] | レルムレコード | 関数が作成され、評価時にアクセスされる組み込みオブジェクトを提供するレルム。 |
[[ScriptOrModule]] | スクリプトレコード または モジュールレコード | 関数を作成したスクリプトまたはモジュール。 |
[[ThisMode]] | lexical | strict | global |
this参照が、関数の仮パラメーターとコード本体内でどのように解釈されるかを定義します。 lexicalは、thisが字句的に囲まれた関数のthis値を参照することを意味します。 strictは、this値が関数の呼び出しによって提供されたとおりに使用されることを意味します。 globalは、undefinedがグローバルオブジェクトへの参照として解釈されることを意味します。 |
[[Strict]] | Boolean | strict関数である場合はtrue、非strict関数である場合はfalse。 |
[[HomeObject]] | Object | 関数がsuperを使用する場合、[[HomeObject]]はsuperプロパティのルックアップが開始されるオブジェクトを[[GetPrototypeOf]]が提供するオブジェクトです。 |
[[SourceText]] | Unicodeコードポイントのシーケンス | 関数を定義するソーステキスト。 |
[[IsClassConstructor]] | Boolean | 関数がクラスコンストラクタかどうかを示します。 (trueの場合、関数の[[Call]]を呼び出すとTypeError例外がスローされます。) |
すべてのECMAScript関数オブジェクトには[[Call]]内部メソッドがあり、ここで定義しています。 さらにコンストラクタでもあるECMAScript関数には、[[Construct]]内部メソッドがあります。
9.2.1 [[Call]] ( thisArgument, argumentsList )
ECMAScript関数オブジェクトFの[[Call]]内部メソッドは、パラメーターthisArgumentとargumentsList(ECMAScript言語値のリスト)で呼び出されます。 次の手順を実行します。
- Assert: F は ECMAScript関数オブジェクト
- F.[[IsClassConstructor]] が true なら、 TypeError例外をスローする.
- 実行中の実行コンテキスト を callerContext とする
- PrepareForOrdinaryCall(F, undefined) を calleeContext とする
- Assert: calleeContext は 実行中の実行コンテキスト
- OrdinaryCallBindThis(F, calleeContext, thisArgument)を実行
- OrdinaryCallEvaluateBody(F, argumentsList) を result とする
- 実行コンテキストスタック からcalleeContext を削除し、callerContext を 実行中の実行コンテキスト として復元します
- result.[[Type]] が return なら、NormalCompletion(result.[[Value]])を返す
- ReturnIfAbrupt(result).
- NormalCompletion(undefined)を返す
手順8で実行コンテキストスタックから削除されたcalleeContextは、次のとき破棄しないでください。
- アクセス可能なジェネレーターオブジェクトによって後で再開できるように中断および保持されている
9.2.1.1 PrepareForOrdinaryCall ( F, newTarget )
抽象操作PrepareForOrdinaryCallが関数オブジェクトFとECMAScript言語値newTargetで呼び出されると、次の手順が実行されます。
- Assert: Type(newTarget) は Undefined または Object型
- 実行中の実行コンテキスト を callerContext とする
- 新しい ECMAScriptコード実行コンテキスト を calleeContext とする
非常に分かりにくいが、2は、callerContext 、 3は、calleeContext
- F を calleeContextの関数コンポーネント にセットする
- F.[[Realm]] を calleeRealm とする
- calleeRealm を calleeContextのレルムコンポーネント にセットする
- F.[[ScriptOrModule]] をcalleeContextのScriptOrModuleコンポーネント にセットする
- NewFunctionEnvironment(F, newTarget) を localEnv とする
- localEnv を calleeContext のLexicalEnvironmentコンポーネントにセットする
- localEnv を calleeContextのVariableEnvironmentコンポーネント にセットする
- callerContext が 中断していないなら、callerContextを中断する
- calleeContext を 実行コンテキストスタック にプッシュする。 calleeContext が 実行中の実行コンテキスト になる。
- NOTE: これ以降に生成される例外オブジェクトは、calleeRealmに関連付けられる。
- calleeContextを返す
9.2.1.2 OrdinaryCallBindThis ( F, calleeContext, thisArgument )
抽象操作OrdinaryCallBindThisが関数オブジェクトF、実行コンテキストcalleeContext、およびECMAScript値thisArgumentで呼び出されると、次の手順が実行されます。
- F.[[ThisMode]] を thisMode とする
- thisMode が lexical なら、 NormalCompletion(undefined)を返す
- F.[[Realm]] を calleeRealm とする
- calleeContext の LexicalEnvironmentコンポーネントを localEnv とする
- thisMode が strict なら、 thisArgument を thisValue とする
- 5.でないなら
- thisArgument が undefined か nullなら、
- calleeRealm.[[GlobalEnv]] を globalEnv とする
- globalEnvの EnvironmentRecord を globalEnvRec とする
- Assert: globalEnvRec は グローバル環境レコード
- globalEnvRec.[[GlobalThisValue]] を thisValue とする
- a.と異なるなら
- thisArgument が undefined か nullなら、
- localEnv の EnvironmentRecord を envRec とする
- Assert: envRec は 関数環境レコード
- Assert: envRec.[[ThisBindingStatus]] が初期化されていないため、次のステップで突然の完了が返ることはない
- envRec.BindThisValue(thisValue)を返す
9.2.1.3 OrdinaryCallEvaluateBody ( F, argumentsList )
抽象操作OrdinaryCallEvaluateBodyが関数オブジェクトFとargumentsListで呼び出されると、次の手順が実行されます。
- FとargumentsListを引数として渡したF.[[ECMAScriptCode]]である解析済みコードのEvaluateBodyの結果を返します。
9.2.2 [[Construct]] ( argumentsList, newTarget )
ECMAScript関数オブジェクトFの[[Construct]]内部メソッドは、argumentsListおよびnewTargetパラメータを使用して呼び出されます。 argumentsListは、おそらく空のECMAScript言語値のリストです。 次の手順を実行します。
- Assert: F はECMAScript関数オブジェクト
- Assert: Type(newTarget) は Object型
- 実行中の実行コンテキスト を callerContext とする
- F.[[ConstructorKind]] を kind とする
- kind が base なら、
- ? OrdinaryCreateFromConstructor(newTarget, "%Object.prototype%") を thisArgument とする
- PrepareForOrdinaryCall(F, newTarget) を calleeContext とする
- Assert: calleeContext は 実行中の実行コンテキスト
- kind が base なら、 OrdinaryCallBindThis(F, calleeContext, thisArgument)を実行する
- calleeContext の LexicalEnvironment を constructorEnv とする
- constructorEnv の EnvironmentRecord を envRec とする
- OrdinaryCallEvaluateBody(F, argumentsList) を result とする
- 実行コンテキストスタック から calleeContext を削除し、実行中の実行コンテキスト として callerContext を復元する
- result.[[Type]] が return なら、
- Type(result.[[Value]]) が Object型なら、NormalCompletion(result.[[Value]])を返す
- kind が base なら、NormalCompletion(thisArgument)を返す
- result.[[Value]] が undefined でないなら、 TypeError例外をスローする
- 13.でないなら ReturnIfAbrupt(result)
- ? envRec.GetThisBinding()を返す
9.2.3 OrdinaryFunctionCreate ( functionPrototype, ParameterList, Body, thisMode, Scope )
抽象操作OrdinaryFunctionCreateは、5つの引数をとります。オブジェクトfunctionPrototype、パラメーターリストのパースノードParameterList、本文のパースノードBody、lexical-thisまたはnon-lexical-thisのthisMode、およびレキシカル環境Scope 。 OrdinaryFunctionCreateは、次の手順を実行します。
- Assert: Type(functionPrototype) は Object型
- 表27 の内部スロットのリスト を internalSlotsList とする
- ! OrdinaryObjectCreate(functionPrototype, internalSlotsList) を F とする
- 9.2.1 で定義しているコードを F.[[Call]] にセットする
- ParameterList を F.[[FormalParameters]] にセットする
- Body を F.[[ECMAScriptCode]] にセットする
- Body一致するソーステキストがstrictモードコードなら true を、異なるなら false を strict とする
- Strict を F.[[Strict]] にセットする
- thisMode が lexical-this なら、 lexical を F.[[ThisMode]] にセットする
- 9.ではなく Strict が true なら、strict を F.[[ThisMode]] にセットする
- 9. 10. ではないなら、 global を F.[[ThisMode]] にセットする
- false を F.[[IsClassConstructor]] にセットする
- Scope を F.[[Environment]] にセットする
- GetActiveScriptOrModule() を F.[[ScriptOrModule]] にセットする
- 現在のレルムレコード を F.[[Realm]] にセットする
- undefined を F.[[HomeObject]] にセットする
- ParameterList の ExpectedArgumentCount を len とする
- ! SetFunctionLength(F, len)を実行
- Fを返す
9.2.4 AddRestrictedFunctionProperties ( F, realm )
抽象操作AddRestrictedFunctionPropertiesは、関数オブジェクトFとレルムレコードrealmを引数として呼び出されます。 次の手順を実行します。
- Assert: realm.[[Intrinsics]].[[%ThrowTypeError%]] は存在し、初期化されている
- realm.[[Intrinsics]].[[%ThrowTypeError%]] を thrower とする
- ! DefinePropertyOrThrow(F, "caller", プロパティ記述子{ [[Get]]: thrower, [[Set]]: thrower, [[Enumerable]]: false, [[Configurable]]: true })を実行
- ! DefinePropertyOrThrow(F, "arguments", プロパティ記述子{ [[Get]]: thrower, [[Set]]: thrower, [[Enumerable]]: false, [[Configurable]]: true })を返す
9.2.4.1 %ThrowTypeError% ( )
%ThrowTypeError%組み込み関数は、レルムごとに1回定義される匿名の組み込み関数オブジェクトです。 %ThrowTypeError%が呼び出されると、次の手順を実行します。
- TypeError例外をスローする
%ThrowTypeError%関数の[[Extensible]]内部スロットの値はfalseです。
%ThrowTypeError%関数の"length"プロパティには、属性{[[Writable]]:false,[[Enumerable]]:false,[[Configurable]]:false}があります。
9.2.5 MakeConstructor ( F [ , writablePrototype [ , prototype ] ] )
抽象操作MakeConstructorには、関数の引数Fと、オプションでブール値writablePrototypeとオブジェクトprototypeが必要です。 prototypeが指定されている場合、値がFである"constructor"プロパティがすでに含まれていることが想定されます。この操作では、次の手順を実行してFをコンストラクターに変換します。
- Assert: F は ECMAScript関数オブジェクト
- Assert: IsConstructor(F) は false
- Assert: F は "prototype" 独自プロパティ を持っていない、かつ、拡張可能なオブジェクト
- 9.2.2 で定義しているコードを F.[[Construct]] にセットする
- base を F.[[ConstructorKind]] にセットする
- writablePrototype が存在しないなら、 true を writablePrototype にセットする
- prototype が存在しないなら、
- OrdinaryObjectCreate(%Object.prototype%) を prototype にセットする
- ! DefinePropertyOrThrow(prototype, "constructor", プロパティ記述子{ [[Value]]: F, [[Writable]]: writablePrototype, [[Enumerable]]: false, [[Configurable]]: true })を実行
- ! DefinePropertyOrThrow(F, "prototype", プロパティ記述子{ [[Value]]: prototype, [[Writable]]: writablePrototype, [[Enumerable]]: false, [[Configurable]]: false })を実行
- NormalCompletion(undefined)を返す
9.2.6 MakeClassConstructor ( F )
引数Fを持つ抽象操作MakeClassConstructorは、次の手順を実行します。
- Assert: F は ECMAScript関数オブジェクト
- Assert: F.[[IsClassConstructor]] は false
- true を F.[[IsClassConstructor]] にセットする
- NormalCompletion(undefined)を返す
9.2.7 MakeMethod ( F, homeObject )
引数FとhomeObjectを持つ抽象操作MakeMethodは、次の手順を実行してFをメソッドとして構成します。
- Assert: F は ECMAScript関数オブジェクト
- Assert: Type(homeObject) は Object型
- homeObject を F.[[HomeObject]] にセットする
- NormalCompletion(undefined)を返す
9.2.8 SetFunctionName ( F, name [ , prefix ] )
抽象操作SetFunctionNameには、関数F、文字列またはシンボルname、およびオプションで文字列span class="t">prefixが必要です。 この操作では、次の手順を実行して、"name"プロパティをFに追加します。
- Assert: F は "name" 独自プロパティを持っていない、かつ拡張可能なオブジェクト
- Assert: Type(name) は Symbol型 か String型
- Assert: prefix が存在するなら、 Type(prefix) は String型
- Type(name) が Symbol型なら、
- name の [[Description]]値 を description とする
- description が undefined なら、 空文字 を name にセットする
- b.でないなら、 "["、description、 "]" を順番につなげたものを name にセットする
- prefix が存在するなら、
- prefix、コードユニット0x0020(SPACE)、nameの順番につなげた文字列 を name にセットする
- ! DefinePropertyOrThrow(F, "name", プロパティ記述子 { [[Value]]: name, [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true })を返す
9.2.9 SetFunctionLength ( F, length )
抽象演算SetFunctionLengthには、関数Fと数値lengthが必要です。この操作では、次の手順を実行して、Fに"length"プロパティを追加します。
- Assert: F "length" 独自プロパティを持っていない、かつ拡張可能なオブジェクト
- Assert: Type(length) は Number型
- Assert: ! IsNonNegativeInteger(length) が true
- ! DefinePropertyOrThrow(F, "length", プロパティ記述子 { [[Value]]: length, [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true })を返す
9.2.10 FunctionDeclarationInstantiation ( func, argumentsList )
FunctionDeclarationInstantiationは、引数funcとargumentsListを使用して次のように実行されます。 funcは、実行コンテキストが確立されている関数オブジェクトです。
- 実行中の実行コンテキスト を calleeContext とする
- func.[[ECMAScriptCode]] を code とする
- func.[[Strict]] を strict とする
- func.[[FormalParameters]] を formals とする
- formals の BoundNames を parameterNames とする
- parameterNames に重複要素があるならtrue、そうでないなら false を hasDuplicates とする
- formals の IsSimpleParameterList を simpleParameterList とする
- formals の ContainsExpression を hasParameterExpressions とする
- code の VarDeclaredNames を varNames とする
- code の VarScopedDeclarations を varDeclarations とする
- code の LexicallyDeclaredNames を lexicalNames とする
- 空の新規List を functionNames とする
- 空の新規List を functionsToInitialize とする
- varDeclarationsの各dに対して、リストの逆順で、次を実行
- d が VariableDeclaration、ForBinding、BindingIdentifier 以外なら、
- Assert: dは、FunctionDeclaration、GeneratorDeclaration、AsyncFunctionDeclaration、AsyncGeneratorDeclarationのどれか
- d のBoundNamesの唯一の要素を fn とする
- fn が functionNames の要素でないなら、
- functionNames の先頭に fn を挿入する
- NOTE: 同名の関数宣言が複数ある場合は、最後の宣言が使用される
- functionsToInitialize の先頭に d を挿入する
- d が VariableDeclaration、ForBinding、BindingIdentifier 以外なら、
- true を argumentsObjectNeeded とする
- func.[[ThisMode]] が lexical なら、
- NOTE: アロー関数は引数オブジェクトを持たない
- false を argumentsObjectNeeded にセットする
- 16.でなく "arguments"が parameterNames の要素なら、
- false を argumentsObjectNeeded にセットする
- 16. 17. でなく hasParameterExpressions が false なら、
- "arguments" が functionNames または、lexicalNames の要素なら、
- false を argumentsObjectNeeded にセットする
- "arguments" が functionNames または、lexicalNames の要素なら、
- strict が true または hasParameterExpressions が false なら、
- NOTE: パラメータとトップレベルの変数に必要なレキシカル環境は1つだけです。
- calleeContext のLexicalEnvironment を env とする
- envの EnvironmentRecord を envRec とする
- 19. でないなら
- NOTE: 仮パラメーターリスト内のダイレクトeval呼び出しによって作成されたバインディングを、パラメーターが宣言されている環境の外部に確実にセットするには、別個の環境レコードが必要。
- calleeContext のLexicalEnvironmentを calleeEnv とする
- NewDeclarativeEnvironment(calleeEnv) を env とする
- env の EnvironmentRecord を envRec とする
- Assert: calleeContext の VariableEnvironment は calleeEnv
- env を calleeContext の LexicalEnvironment にセットする
- parameterNames の各文字列paramNameに対して、
- envRec.HasBinding(paramName) を alreadyDeclared とする
- NOTE: 初期のエラーにより、パラメーター名の重複は、パラメーターのデフォルト値または残りのパラメーターを持たない非strict関数でのみ発生することが保証される
- alreadyDeclared が false なら、
- ! envRecCreateMutableBinding(paramName, false)を実行
- hasDuplicates が true なら、
- ! envRec.InitializeBinding(paramName, undefined)を実行
- argumentsObjectNeeded が true なら、
- strict が true または simpleParameterList が false なら、
- CreateUnmappedArgumentsObject(argumentsList) を ao とする
- a.でないなら
- NOTE: マップされた引数オブジェクトは、restパラメーター、パラメーターのデフォルト値の初期化子、または非構造化パラメーターを持たない非strict関数に対してのみ提供される。
- CreateMappedArgumentsObject(func, formals, argumentsList, envRec) を ao とする
- strict が true なら、
- ! envRec.CreateImmutableBinding("arguments", false)を実行
- c. でないなら
- ! envRec.CreateMutableBinding("arguments", false)を実行
- envRec.InitializeBinding("arguments", ao)を呼び出す
- "arguments" が追加された新しいparameterNamesのリストを parameterBindings とする
- strict が true または simpleParameterList が false なら、
- 22. でないなら、
- parameterNames を parameterBindings とする
- CreateListIteratorRecord(argumentsList) を iteratorRecord とする
- hasDuplicates が true なら、
- iteratorRecord と undefined を引数としてformalsに対して? IteratorBindingInitializationを実行。
- Else,
- iteratorRecord と env を引数としてformalsに対して? IteratorBindingInitializationを実行。
- hasParameterExpressions が false なら、
- NOTE: パラメータとトップレベルの変数に必要なレキシカル環境は1つだけです。
- parameterBindingsのコピー を instantiatedVarNames とする
- varNamesの各nに対して、
- n が instantiatedVarNames の要素でないなら、
- instantiatedVarNames に n を追加
- ! envRec.CreateMutableBinding(n, false)を実行
- envRec.InitializeBinding(n, undefined)を呼び出す
- n が instantiatedVarNames の要素でないなら、
- env を varEnv とする
- envRec を varEnvRec とする
- Else,
- NOTE: 仮パラメーターリスト内の式によって作成されたクロージャーが関数本体の宣言の可視性を持たないようにするには、別の環境レコードが必要です。
- NewDeclarativeEnvironment(env) を varEnv とする
- varEnv の EnvironmentRecord を varEnvRec とする
- varEnv を calleeContext の VariableEnvironment にセットする
- 空の新規List を instantiatedVarNames とする
- varNames の各nに対して、
- n が instantiatedVarNamesの要素でないなら、
- instantiatedVarNames に n を追加
- ! varEnvRec.CreateMutableBinding(n, false)を実行
- n が parameterBindings の要素でない、または functionNames の要素なら、 undefined を initialValue とする
- 3. でないなら
- ! envRec.GetBindingValue(n, false) を initialValue とする
- varEnvRec.InitializeBinding(n, initialValue)を呼び出す
- NOTE: 仮パラメーターと同名の変数は、最初は対応する初期化パラメーターと同じ値を持っています。
- n が instantiatedVarNamesの要素でないなら、
- NOTE: B.3.3.1では、この時点で追加の手順が提示されています。
- strict が false なら、
- NewDeclarativeEnvironment(varEnv) を lexEnv とする
- NOTE: 非strict関数は、トップレベルのレキシカル宣言に個別のレキシカル環境レコードを使用します。そのため、ダイレクトevalは、evalコードによって導入されたvarスコープ宣言が既存のトップレベルのレキシカルスコープ宣言と競合するかどうかを判断できます。 strictなダイレクトevalはすべての宣言を新しい環境レコードに設定するため、strict関数にはこの処理は必要ありません。
- 31.でないなら varEnv を lexEnv とする
- lexEnvの EnvironmentRecord を lexEnvRec とする
- lexEnv を calleeContext の LexicalEnvironment にセットする
- code の LexicallyScopedDeclarations を lexDeclarations とする
- lexDeclarations の各要素を d として、d に対して、
- NOTE: レキシカル的に宣言された名前は、関数/ジェネレーター宣言、仮パラメーター、またはvar名と同じにすることはできません。 レキシカル的に宣言された名前は、ここでのみインスタンス化され、初期化されません。
- d の BoundNames の各要素を dn として、dn に対して、
- d の IsConstantDeclaration が true なら、
- ! lexEnvRec.CreateImmutableBinding(dn, true)を実行
- Else,
- ! lexEnvRec.CreateMutableBinding(dn, false)を実行
- d の IsConstantDeclaration が true なら、
- functionsToInitializeの各パースノードをfとし、fに対して、
- f の BoundNames の唯一の要素 を fn とする
- 引数lexEnvを指定したf の InstantiateFunctionObject を fo とする
- ! varEnvRec.SetMutableBinding(fn, fo, false)を実行
- NormalCompletion(empty)を返す
9.3 組み込み関数オブジェクト(Built-in Function Objects)
この仕様で定義している組み込み関数オブジェクトは、ECMAScriptコードで動作するECMAScript関数オブジェクト(9.2)として、または他の方法で提供される関数エキゾチックなオブジェクトとして実装できます。 どちらの場合も、関数を呼び出した結果は、それらの仕様に準拠している必要があります。 実装では、この仕様で定義していない追加の組み込み関数オブジェクトを提供する場合もあります。
組み込み関数オブジェクトがエキゾチックなオブジェクトとして実装されている場合、9.1で指定されている通常のオブジェクト動作が必要です。 そのようなすべての関数エキゾチックなオブジェクトには、[[Prototype]]、[[Extensible]]、[[Realm]]、および[[ScriptOrModule]]内部スロットもあります。
特に指定がない限り、すべての組み込み関数オブジェクトには、[[Prototype]]内部スロットの初期値として%Function.prototype%オブジェクトがあります。
アルゴリズムのステップまたは他の方法で指定された各組み込み関数の動作は、関数の[[Call]]と[[Construct]]呼び出しでの動作仕様です。ただし一部の関数は、[[Construct]]の呼び出しをサポートしていません。組み込み関数を[[Call]]で呼び出すと、thisArgumentはthis値が、argumentsListは名前付きパラメーターが、NewTarget値はundefinedがセットされます。[[Construct]]で呼び出すと、this値は初期化されず、argumentsListは名前付きパラメーターを、newTargetはNewTarget値がセットされます。組み込み関数がECMAScript関数オブジェクトとして実装されている場合、指定された動作は、関数の本体であるECMAScriptコードによって実装される必要があります。ECMAScript関数オブジェクトである組み込み関数は、strict関数でなければなりません。組み込みコンストラクターにTypeError例外をスローする以外の[[Call]]動作がある場合、実装は、関数の[[IsClassConstructor]]内部スロットの値がtrueにならないようにする必要があります。
コンストラクターとして識別されない組み込み関数オブジェクトは、特に指定されていない限り、[[Construct]]内部メソッドを実装しません。 組み込みコンストラクターがnew式の一部として呼び出されると、呼び出された[[Construct]]内部メソッドのargumentsListパラメーターは、組み込みコンストラクターの名前付きパラメーターの値を提供します。
コンストラクターではない組み込み関数には、特定の関数の説明で特に指定されていない限り、"prototype"プロパティーはありません。
組み込み関数オブジェクトがECMAScript関数として実装されていない場合、次の定義に準拠する[[Call]]および[[Construct]]内部メソッドを提供する必要があります。
9.3.1 [[Call]] ( thisArgument, argumentsList )
組み込み関数オブジェクトFの[[Call]]内部メソッドは、パラメーターthisArgumentおよびargumentsListで呼び出されます。 次の手順を実行します。
- 実行中の実行コンテキスト を callerContext とする
- callerContext が中断さていないなら、callerContextを中断する
- 新規 実行コンテキスト を calleeContext とする
- F を calleeContextの関数コンポーネント にセットする
- F.[[Realm]] を calleeRealm とする
- calleeRealm を calleeContext のレルムコンポーネントにセットする
- F.[[ScriptOrModule]] を calleeContext のScriptOrModuleコンポーネントにセットする
- calleeContextの必要な実装定義の初期化をおこなう
- calleeContext を 実行コンテキストスタックにプッシュする。calleeContext が 実行中の実行コンテキストになる
- F を実行した結果の完了レコードを result とする。 thisArgument は this値、argumentsListは名前付きパラメーター、 NewTargetは undefined
- 実行コンテキストスタック から calleeContext を削除し、callerContext を 実行中の実行コンテキスト として復元する
- resultを返す
9.3.2 [[Construct]] ( argumentsList, newTarget )
組み込み関数オブジェクトFの[[Construct]]内部メソッドは、argumentsListおよびnewTargetパラメータを使用して呼び出されます。 実行されるステップは、[[Call]](9.3.1を参照)と同じですが、ステップ10が次のように置き換えられます。
- F を実行した結果の完了レコードを result とする。 this値 はundefined、argumentsListは名前付きパラメーター、 NewTargetは NewTarget値
9.3.3 CreateBuiltinFunction ( steps, internalSlotsList [ , realm [ , prototype ] ] )
抽象オペレーションCreateBuiltinFunctionは、steps、internalSlotsList、realm、およびprototypeを取ります。 引数internalSlotsListは、オブジェクトの一部として定義する必要がある追加内部スロット名リストです。 CreateBuiltinFunctionは、次の手順で組み込み関数オブジェクト作成し、返します。
- Assert: steps は一連のアルゴリズムステップか、この仕様で提供される他の関数の動作定義です。
- realm が存在しないなら, 現在のレルムレコード を realm にセットする
- Assert: realm は レルムレコード
- prototype が存在しないなら、 realm.[[Intrinsics]].[[%Function.prototype%]] を prototype にセットする
- 呼び出されるとstepsに記述されている動作を実行する新しい組み込み関数オブジェクトを func とする。新しい関数オブジェクトには、internalSlotsListの要素と同じ名前の内部スロットがある。
- realm を func.[[Realm]] にセットする
- prototype を func.[[Prototype]] にセットする
- true を func.[[Extensible]] にセットする
- null を func.[[ScriptOrModule]] にセットする
- funcを返す
この仕様で定義されている各組み込み関数は、NewDeclarativeEnvironment抽象オペレーションを呼び出すことによって作成されます。
9.4 組み込みのエキゾチックオブジェクトの内部メソッドとスロット(Built-in Exotic Object Internal Methods and Slots)
この仕様は、いくつかの組み込みエキゾチックオブジェクトを定義しています。 これらのオブジェクトは、特定の状況を除いて、通常のオブジェクトと同様に動作します。 以下のエキゾチックなオブジェクトは、以下で明示的に指定されている場合を除き、通常のオブジェクト内部メソッドを使用します。
9.4.1 バインドされた関数エキゾチックオブジェクト(Bound Function Exotic Objects)
バウンド関数エキゾチックオブジェクト
バインドされた関数エキゾチックオブジェクトは、関数オブジェクトをラップするエキゾチックなオブジェクトです。 バインドされた関数エキゾチックオブジェクトは呼び出し可能です([[Call]]内部メソッドがあり、[[Construct]]内部メソッドがある場合があります)。 バインドされた関数のエキゾチックなオブジェクトを呼び出すと、通常、ラップされた関数が呼び出されます。
[[Call]]および、該当する場合、[[Construct]]内部メソッドが次の実装を使用し、その他の重要な内部メソッドが9.1にある定義を使用する場合、オブジェクトはバインドされた関数エキゾチックオブジェクトです。 これらのメソッドはBoundFunctionCreateでインストールされます。
バインドされた関数エキゾチックオブジェクトには、表27にリストされているECMAScript関数オブジェクトの内部スロットがありません。代わりに、[[Prototype]]と[[Extensible]]に加えて、表28にリストされている内部スロットがあります。
内部スロット | 型 | 内容 |
---|---|---|
[[BoundTargetFunction]] | 呼び出し可能なオブジェクト | ラップされた関数オブジェクト。 |
[[BoundThis]] | Any | ラップされた関数呼び出し時、this値として渡される値。 |
[[BoundArguments]] | List of Any | ラップされた関数呼び出し時、最初の引数として使用される値のリスト。 |
9.4.1.1 [[Call]] ( thisArgument, argumentsList )
バインドされた関数のエキゾチックオブジェクトの[[Call]]内部メソッドFは、bind関数を使用して作成されます。[[Call]]がパラメーターthisArgumentおよびargumentsListで呼び出されると、次の手順が実行されます。
9.4.1.2 [[Construct]] ( argumentsList, newTarget )
bind関数を使用して作成されたバインドされた関数のエキゾチックなオブジェクトFの[[Construct]]内部メソッドが、argumentsListおよびnewTargetで呼び出されると、次の手順が実行されます。
- F.[[BoundTargetFunction]] を target とする
- Assert: IsConstructor(target) は true
- F.[[BoundArguments]] を boundArgs とする
- boundArgsの値を順番にargsにセットし、その後にargumentsListの値を順番にargsにセットする
- SameValue(F, newTarget) が true なら、 target を newTarget にセットする
- ? Construct(target, args, newTarget)を返す
9.4.1.3 BoundFunctionCreate ( targetFunction, boundThis, boundArgs )
引数targetFunction、boundThis、およびboundArgsを持つ抽象オペレーションBoundFunctionCreateは、新しいバインドされた関数のエキゾチックオブジェクトの作成します。 次の手順を実行します。
- Assert: Type(targetFunction) は Object型
- ? targetFunction.[[GetPrototypeOf]]() を proto とする
- 表28の内部スロットと [[Prototype]]、[[Extensible]] を internalSlotsList とする
- ! MakeBasicObject(internalSlotsList) を obj とする
- proto を obj.[[Prototype]] にセットする
- 9.4.1.1の処理をobj.[[Call]]にセット
- IsConstructor(targetFunction) が true なら、
- 9.4.1.2 の処理を obj.[[Construct]]にセット
- targetFunction を obj.[[BoundTargetFunction]] にセットする
- boundThis を obj.[[BoundThis]] にセットする
- boundArgs を obj.[[BoundArguments]] にセットする
- objを返す
9.4.2 Arrayエキゾチックオブジェクト(Array Exotic Objects)
Arrayエキゾチックオブジェクト
Arrayオブジェクトは、配列インデックスプロパティキーに特別な扱いをさせるエキゾチックなオブジェクトです(6.1.7を参照)。プロパティ名が配列インデックスであるプロパティは、要素とも呼ばれます。すべてのArrayオブジェクトには、設定不可能な"length"プロパティがあり、その値は232未満の負でない整数です。"length"プロパティの値は、配列インデックスとして評価できる独自プロパティ名よりも数値的に大きくなります。Arrayオブジェクトの独自のプロパティが作成または変更されると、この条件を維持するために他のプロパティが必要に応じて調整されます。特に、配列インデックスである独自のプロパティが追加されると、"length"プロパティの値は、必要に応じて、その配列インデックスの数値よりも1だけ大きくなるように変更されます。また、"length"プロパティの値が変更されると、"length"以上のすべての独自プロパティが削除されます。この制約は、Arrayオブジェクトの独自のプロパティにのみ適用され、プロトタイプから継承されている"length"または配列のインデックスプロパティの影響を受けません。
[[DefineOwnProperty]]内部メソッドが次の実装を使用し、その他の重要な内部メソッドが9.1にある定義を使用する場合、オブジェクトはArrayエキゾチックオブジェクト(または単にArrayオブジェクト)です。 これらのメソッドはArrayCreateでインストールされます。
9.4.2.1 [[DefineOwnProperty]] ( P, Desc )
ArrayエキゾチックオブジェクトAの[[DefineOwnProperty]]内部メソッドがプロパティキーPとプロパティ記述子Descで呼び出されると、次の手順が実行されます。
- Assert: IsPropertyKey(P) は true
- P が "length"なら、
- ? ArraySetLength(A, Desc)を返す
- 2.でなく P が 配列インデックスなら、
- OrdinaryGetOwnProperty(A, "length") を oldLenDesc とする
- Assert: 削除または再構成できない"length"データプロパティでArrayオブジェクトが作成されるため、oldLenDescが未定義またはアクセサ記述子になることはない
- oldLenDesc.[[Value]] を oldLen とする
- Assert: IsNonNegativeInteger(oldLen) は true
- ! ToUint32(P) を index とする
- index ≧ oldLen で oldLenDesc.[[Writable]] が false なら、 false を返す
- ! OrdinaryDefineOwnProperty(A, P, Desc) を succeeded とする
- succeeded が false なら、 false を返す
- index ≧ oldLenなら、
- index + 1 を oldLenDesc.[[Value]] にセットする
- OrdinaryDefineOwnProperty(A, "length", oldLenDesc) を succeeded とする
- Assert: succeeded は true
- true を返す
- OrdinaryDefineOwnProperty(A, P, Desc)を返す
9.4.2.2 ArrayCreate ( length [ , proto ] )
length(0または正の整数)とオプションprotoを持つ抽象操作ArrayCreateは、新しい配列のエキゾチックオブジェクトを作成します。 次の手順を実行します。
- Assert: ! IsNonNegativeInteger(length) は true
- length が -0 なら、 +0 を length にセットする
- If length > 232 - 1 なら RangeError例外をスローする
- proto が存在しないなら、 %Array.prototype% を proto にセットする
- ! MakeBasicObject(« [[Prototype]], [[Extensible]] ») を A とする
- proto を A.[[Prototype]] にセットする
- 9.4.2.1 の処理を A.[[DefineOwnProperty]] にセット
- ! OrdinaryDefineOwnProperty(A, "length", プロパティ記述子 { [[Value]]: length, [[Writable]]: true, [[Enumerable]]: false, [[Configurable]]: false })を実行
- Aを返す
9.4.2.3 ArraySpeciesCreate ( originalArray, length )
引数originalArrayとlengthを持つ抽象操作ArraySpeciesCreateは、originalArrayから派生したコンストラクター関数を使用して、新しいArrayオブジェクトを作成します。 次の手順を実行します。
- Assert: ! IsNonNegativeInteger(length) は true
- length が -0 なら、 +0 を length にセットする
- ? IsArray(originalArray) を isArray とする
- isArray が false なら、 ? ArrayCreate(length)を返す
- ? Get(originalArray, "constructor") を C とする
- IsConstructor(C) が true なら、
- 現在のレルムレコード を thisRealm とする
- ? GetFunctionRealm(C) を realmC とする
- thisRealm と realmC が同じレルムレコードではないなら、
- Type(C) が Object型なら、
- C が undefined なら、? ArrayCreate(length)を返す
- IsConstructor(C) が false なら、 TypeError例外をスローする
- ? Construct(C, « length »)を返す
9.4.2.4 ArraySetLength ( A, Desc )
抽象演算ArraySetLengthが配列エキゾチックオブジェクトAとプロパティ記述子Descを使用して呼び出されると、次の手順が実行されます。
- Desc.[[Value]] が 存在しないなら、
- OrdinaryDefineOwnProperty(A, "length", Desc)を返す
- Desc のコピーを newLenDesc とする
- ? ToUint32(Desc.[[Value]]) を newLen とする
- ? ToNumber(Desc.[[Value]]) を numberLen とする
- newLen ≠ numberLen なら RangeError例外をスローする
- newLen を newLenDesc.[[Value]] にセットする
- OrdinaryGetOwnProperty(A, "length") を oldLenDesc とする
- Assert: 削除または再構成できないlengthデータプロパティでArrayオブジェクトが作成されるため、oldLenDescがundefinedまたはアクセサ記述子になることはありません。
- oldLenDesc.[[Value]] を oldLen とする
- newLen ≧ oldLen なら、
- OrdinaryDefineOwnProperty(A, "length", newLenDesc)を返す
- oldLenDesc.[[Writable]] が false なら、 false を返す
- newLenDesc.[[Writable]] が存在しない、または値がtrueなら、true を newWritable とする
- 12.でないなら、
- 要素を削除できない場合に備えて、[[Writable]]属性をfalseへ設定するのを延期する必要がある
- false を newWritable とする
- true を newLenDesc.[[Writable]] にセットする
- ! OrdinaryDefineOwnProperty(A, "length", newLenDesc) を succeeded とする
- succeeded が false なら、 false を返す
- Aの配列インデックスキーをPとし、各Pに対して数値がnewLen以上の数値インデックスの降順で、次をおこなう。
- ! A.[[Delete]](P) を deleteSucceeded とする
- deleteSucceeded が false なら、
- ! ToUint32(P) + 1 を newLenDesc.[[Value]] にセットする
- newWritable が false なら、false を newLenDesc.[[Writable]] にセットする
- ! OrdinaryDefineOwnProperty(A, "length", newLenDesc)を実行
- false を返す
- newWritable が false なら、
- OrdinaryDefineOwnProperty(A, "length", プロパティ記述子 { [[Writable]]: false })を返す。 (この呼び出しは常にtrueを返す)
- true を返す
9.4.3 Stringエキゾチックオブジェクト(String Exotic Objects)
Stringオブジェクトは、String値をカプセル化し、String値の個々のコードユニット要素に対応する仮想整数インデックスデータプロパティを公開するエキゾチックなオブジェクトです。 Stringエキゾチックオブジェクトには、常に"length" という名前のデータプロパティがあり、その値はカプセル化された文字列値のコードユニット要素の数です。 コード単位のデータプロパティと"length" プロパティの両方は、書き込みや構成ができません。
[[GetOwnProperty]]、[[DefineOwnProperty]]、および[[OwnPropertyKeys]]内部メソッドが以降の実装を使用し、その他の重要な内部メソッドが9.1にある定義を使用する場合、オブジェクトはStringエキゾチックオブジェクト(または単にStringオブジェクト)です。 これらのメソッドはStringCreateでインストールされます。
Stringエキゾチックなオブジェクトには、通常のオブジェクトと同じ内部スロットがあります。 また、[[StringData]]内部スロットもあります。
9.4.3.1 [[GetOwnProperty]] ( P )
StringエキゾチックオブジェクトSの[[GetOwnProperty]]内部メソッドがプロパティキーPで呼び出されると、次の手順が実行されます。
- Assert: IsPropertyKey(P) は true
- OrdinaryGetOwnProperty(S, P) を desc とする
- desc が undefined でないなら、 desc を返す
- ! StringGetOwnProperty(S, P)を返す
9.4.3.2 [[DefineOwnProperty]] ( P, Desc )
StringエキゾチックオブジェクトSの[[DefineOwnProperty]]内部メソッドがプロパティキーPとプロパティ記述子Descで呼び出されると、次の手順が実行されます。
- Assert: IsPropertyKey(P) は true
- ! StringGetOwnProperty(S, P) を stringDesc とする
- stringDesc が undefined でないなら、
- S.[[Extensible]] を extensible とする
- ! IsCompatiblePropertyDescriptor(extensible, Desc, stringDesc)を返す
- ! OrdinaryDefineOwnProperty(S, P, Desc)を返す
9.4.3.3 [[OwnPropertyKeys]] ( )
StringエキゾチックオブジェクトOの[[OwnPropertyKeys]]内部メソッドが呼び出されると、次の手順が実行されます。
- 空の新規List を keys とする
- O.[[StringData]] を str とする
- Assert: Type(str) は String型
- strの長さを len とする
- 0から始まり、i < len となる各整数iについて、昇順で、
- 配列インデックスでToInteger(P) ≧ lenとなるOの各プロパティキーPに対して、数値インデックスの昇順で、
- keysの最後にPを追加
- Type(P)がString型で、配列インデックスではないOの独自のプロパティキーPごとに、プロパティ作成時系列の昇順で、
- keysの最後にPを追加
- Type(P)がSymbol型であるOの独自のプロパティキーPごとに、プロパティ作成時系列の昇順で、
- keysの最後にPを追加
- keysを返す
9.4.3.4 StringCreate ( value, prototype )
引数valueとprototypeを持つ抽象操作StringCreateは、新しいStringエキゾチックオブジェクトを作成します。 次の手順を実行します。
- Assert: Type(value) は String型
- ! MakeBasicObject(« [[Prototype]], [[Extensible]], [[StringData]] ») を S とする
- prototype を S.[[Prototype]] にセットする
- value を S.[[StringData]] にセットする
- 9.4.3.1の処理を S.[[GetOwnProperty]] にセット
- 9.4.3.2の処理を S.[[DefineOwnProperty]] にセット
- 9.4.3.3の処理を S.[[OwnPropertyKeys]] にセット
- value のコード単位要素の数を length とする
- ! DefinePropertyOrThrow(S, "length",プロパティ記述子 { [[Value]]: length, [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false })を実行
- Sを返す
9.4.3.5 StringGetOwnProperty ( S, P )
引数SおよびPを指定して呼び出される抽象操作StringGetOwnPropertyは、次の手順を実行します。
- Assert: S は [[StringData]]内部スロットを持つオブジェクト
- Assert: IsPropertyKey(P) は true
- Type(P) がString型でないなら、 undefined を返す
- ! CanonicalNumericIndexString(P) を index とする
- index が undefined なら、 undefined を返す
- IsInteger(index) が false なら、 undefined を返す
- index = -0 なら undefined を返す
- S.[[StringData]] を str とする
- Assert: Type(str) は String型
- strの長さを len とする
- index < 0 か len ≦ indexなら、 undefined を返す
- strのインデックスindexのコードユニットを含む長さ1の文字列値をresultStrとする
- PropertyDescriptor型 { [[Value]]: resultStr, [[Writable]]: false, [[Enumerable]]: true, [[Configurable]]: false }を返す
9.4.4 Argumentsエキゾチックオブジェクト(Arguments Exotic Objects)
ほとんどのECMAScript関数は、引数オブジェクトをコードで使用できます。 その引数オブジェクトは通常のオブジェクトまたはArgumentsエキゾチックオブジェクトです。 Argumentsエキゾチックオブジェクトは、配列インデックスプロパティが、関連する関数呼び出しの仮パラメーターバインディングにマップされています。
内部メソッドに以降の実装を使用している場合、オブジェクトはArgumentsエキゾチックオブジェクトです。ここで指定されていないものは、9.1にある実装を使用します。 これらのメソッドはCreateMappedArgumentsObjectでインストールされます。
Argumentsエキゾチックオブジェクトには、通常のオブジェクトと同じ内部スロットがあります。 また、[[ParameterMap]]内部スロットがあります。 通常のArgumentsオブジェクトには、[[ParameterMap]]内部スロットもあり、その値は常に未定義です。 通常の引数オブジェクトの場合、[[ParameterMap]]内部スロットは、Object.prototype.toString(19.1.3.6)によってそれらを識別するためにのみ使用されます。
9.4.4.1 [[GetOwnProperty]] ( P )
プロパティキーPで呼び出されたときのArgumentsエキゾチックオブジェクトの[[GetOwnProperty]]内部メソッドは、次の手順を実行します。
- argumentsオブジェクト を args とする
- OrdinaryGetOwnProperty(args, P) を desc とする
- desc が undefined なら、descを返す
- args.[[ParameterMap]] を map とする
- ! HasOwnProperty(map, P) を isMapped とする
- isMapped が true なら、
- Get(map, P) を desc.[[Value]] にセットする
- descを返す
9.4.4.2 [[DefineOwnProperty]] ( P, Desc )
プロパティキーPとプロパティ記述子Descを指定して呼び出されたときのArgumentsエキゾチックオブジェクトの[[DefineOwnProperty]]内部メソッドは、次の手順を実行します。
- argumentsオブジェクト を args とする
- args.[[ParameterMap]] を map とする
- HasOwnProperty(map, P) を isMapped とする
- Desc を newArgDesc とする
- isMapped が true で IsDataDescriptor(Desc) が trueなら、
- Desc.[[Value]] が存在しない、かつ Desc.[[Writable]] が存在し値が false なら、
- Desc のコピーを newArgDesc にセットする
- Get(map, P) を newArgDesc.[[Value]] にセットする
- Desc.[[Value]] が存在しない、かつ Desc.[[Writable]] が存在し値が false なら、
- ? OrdinaryDefineOwnProperty(args, P, newArgDesc) を allowed とする
- allowed が false なら、 false を返す
- isMapped が true なら、
- IsAccessorDescriptor(Desc) が true なら、
- map.[[Delete]](P)を呼び出す
- a. でないなら、
- IsAccessorDescriptor(Desc) が true なら、
- true を返す
9.4.4.3 [[Get]] ( P, Receiver )
プロパティキーPおよびECMAScript言語値Receiverで呼び出されたときのArgumentsエキゾチックオブジェクトの[[Get]]内部メソッドは、次の手順を実行します。
- argumentsオブジェクト を args とする
- args.[[ParameterMap]] を map とする
- ! HasOwnProperty(map, P) を isMapped とする
- isMapped が false なら、
- ? OrdinaryGet(args, P, Receiver)を返す
- 4. でないなら
9.4.4.4 [[Set]] ( P, V, Receiver )
プロパティキーP、値V、およびECMAScript言語値Receiverで呼び出されたときのArgumentsエキゾチックオブジェクトの[[Set]]内部メソッドは、次の手順を実行します。
- argumentsオブジェクト を args とする
- SameValue(args, Receiver) が false なら、
- false を isMapped とする
- 2. でないなら、
- args.[[ParameterMap]] を map とする
- ! HasOwnProperty(map, P) を isMapped とする
- isMapped が true なら、
- ? OrdinarySet(args, P, V, Receiver)を返す
9.4.4.5 [[Delete]] ( P )
プロパティキーPで呼び出されたときの引数エキゾチックオブジェクトの[[Delete]]内部メソッドは、次の手順を実行します。
- argumentsオブジェクト を args とする
- args.[[ParameterMap]] を map とする
- ! HasOwnProperty(map, P) を isMapped とする
- ? OrdinaryDelete(args, P) を result とする
- result が true で isMapped が trueなら、
- map.[[Delete]](P)を呼び出す
- resultを返す
9.4.4.6 CreateUnmappedArgumentsObject ( argumentsList )
引数argumentsListで呼び出される抽象操作CreateUnmappedArgumentsObjectは、次の手順を実行します。
- argumentsList の要素数を len とする
- OrdinaryObjectCreate(%Object.prototype%, « [[ParameterMap]] ») を obj とする
- undefined を obj.[[ParameterMap]] にセットする
- DefinePropertyOrThrow(obj, "length",プロパティ記述子 { [[Value]]: len, [[Writable]]: true, [[Enumerable]]: false, [[Configurable]]: true })を実行
- 0 を index とする
- index < len の間繰り返し
- argumentsList[index] を val とする
- ! CreateDataPropertyOrThrow(obj, ! ToString(index), val)を実行
- index + 1 を index にセットする
- ! DefinePropertyOrThrow(obj, @@iterator,プロパティ記述子 { [[Value]]: %Array.prototype.values%, [[Writable]]: true, [[Enumerable]]: false, [[Configurable]]: true })を実行
- ! DefinePropertyOrThrow(obj, "callee",プロパティ記述子 { [[Get]]: %ThrowTypeError%, [[Set]]: %ThrowTypeError%, [[Enumerable]]: false, [[Configurable]]: false })を実行
- objを返す
9.4.4.7 CreateMappedArgumentsObject ( func, formals, argumentsList, env )
抽象操作CreateMappedArgumentsObjectは、オブジェクトfunc、パースノードformals、リストargumentsList、および環境レコードenvで呼び出されます。 次の手順が実行されます。
- Assert: formalsには、restパラメーター、バインディングパターン、初期化子は含まれていない。 識別子が重複している可能性がある。
- argumentsList の要素数を len とする
- ! MakeBasicObject(« [[Prototype]], [[Extensible]], [[ParameterMap]] ») を obj とする
- 9.4.4.1の処理を obj.[[GetOwnProperty]] にセット
- 9.4.4.2の処理を obj.[[DefineOwnProperty]] にセット
- 9.4.4.3の処理を obj.[[Get]] にセット
- 9.4.4.4の処理を obj.[[Set]] にセット
- 9.4.4.5の処理を obj.[[Delete]] にセット
- %Object.prototype% を obj.[[Prototype]] にセットする
- OrdinaryObjectCreate(null) を map とする
- map を obj.[[ParameterMap]] にセットする
- formals のBoundNamesを parameterNames とする
- parameterNames の要素数を numberOfParameters とする
- 0 を index とする
- index < len の間繰り返し
- argumentsList[index] を val とする
- ! CreateDataPropertyOrThrow(obj, ! ToString(index), val)を実行
- index + 1 を index にセットする
- ! DefinePropertyOrThrow(obj, "length",プロパティ記述子 { [[Value]]: len, [[Writable]]: true, [[Enumerable]]: false, [[Configurable]]: true })を実行
- 空の新規List を mappedNames とする
- numberOfParameters - 1 を index とする
- index ≧ 0 の間繰り返し
- parameterNames[index] を name とする
- name が mappedNames の要素でないなら、
- mappedNames に name を追加
- index < lenなら
- MakeArgGetter(name, env) を g とする
- MakeArgSetter(name, env)) を p とする
- map.[[DefineOwnProperty]](! ToString(index),プロパティ記述子 { [[Set]]: p, [[Get]]: g, [[Enumerable]]: false, [[Configurable]]: true })を実行
- index - 1 を index にセットする
- ! DefinePropertyOrThrow(obj, @@iterator,プロパティ記述子 { [[Value]]: %Array.prototype.values%, [[Writable]]: true, [[Enumerable]]: false, [[Configurable]]: true })を実行
- ! DefinePropertyOrThrow(obj, "callee",プロパティ記述子 { [[Value]]: func, [[Writable]]: true, [[Enumerable]]: false, [[Configurable]]: true })を実行
- objを返す
9.4.4.7.1 MakeArgGetter ( name, env )
文字列nameと環境レコード env で呼び出された抽象操作MakeArgGetterは、実行時にenv内のnameでバインドされた値を返す組み込み関数オブジェクトを作成します。 次の手順を実行します。
- 以下に指定されているArgGetter関数のステップ を steps とする
- ! CreateBuiltinFunction(steps, « [[Name]], [[Env]] ») を getter とする
- name を getter.[[Name]] にセットする
- env を getter.[[Env]] にセットする
- getterを返す
ArgGetter関数:
[[Name]]および[[Env]]内部スロットを持つ匿名の組み込み関数です。 引数を必要としないArgGetter関数が呼び出されると、次の手順が実行されます。
- アクティブ関数オブジェクト を f とする
- f.[[Name]] を name とする
- f.[[Env]] を env とする
- env.GetBindingValue(name, false)を返す
9.4.4.7.2 MakeArgSetter ( name, env )
文字列nameと環境レコードenvで呼び出された抽象操作MakeArgSetterは、組み込み関数オブジェクトを作成します。この関数オブジェクトは、実行されると、env内のnameでバインドされた値を設定します。 次の手順を実行します。
- 以下に指定されているArgSetter関数のステップ を steps とする
- ! CreateBuiltinFunction(steps, « [[Name]], [[Env]] ») を setter とする
- name を setter.[[Name]] にセットする
- env を setter.[[Env]] にセットする
- setterを返す
ArgSetter関数:
[[Name]]および[[Env]]内部スロットを持つ匿名の組み込み関数です。 引数値を指定してArgSetter関数を呼び出すと、次の手順が実行されます。
- アクティブ関数オブジェクト を f とする
- f.[[Name]] を name とする
- f.[[Env]] を env とする
- env.SetMutableBinding(name, value, false)を返す
9.4.5 Integer-Indexedエキゾチックオブジェクト(Integer-Indexed Exotic Objects)
Integer-Indexedエキゾチックオブジェクトは、整数インデックスプロパティキーの特別な処理を実行するエキゾチックなオブジェクトです。
Integer-Indexedエキゾチックオブジェクトには、通常のオブジェクトと同じ内部スロットがあり、さらに[[ViewedArrayBuffer]]、[[ArrayLength]]、[[ByteOffset]]、[[ContentType]]、および[[TypedArrayName]]内部スロットがあります。
この後に定義している[[GetOwnProperty]]、[[HasProperty]]、[[DefineOwnProperty]]、[[Get]]、[[Set]]、および[[OwnPropertyKeys]]内部メソッドと、9.1にあるその他の重要な内部メソッドを持つオブジェクトは、Integer-Indexedエキゾチックオブジェクトです。これらのメソッドは、IntegerIndexedObjectCreateによってインストールされます。
9.4.5.1 [[GetOwnProperty]] ( P )
Integer-IndexedエキゾチックオブジェクトOの[[GetOwnProperty]]内部メソッドがプロパティキーPで呼び出されると、次の手順が実行されます。
- Assert: IsPropertyKey(P) は true
- Assert: O は Integer-Indexedエキゾチックオブジェクト
- Type(P) が String型なら、
- ! CanonicalNumericIndexString(P) を numericIndex とする
- numericIndex が undefined でないなら、
- ? IntegerIndexedElementGet(O, numericIndex) を value とする
- value が undefined なら、 undefined を返す
- PropertyDescriptor型 { [[Value]]: value, [[Writable]]: true, [[Enumerable]]: true, [[Configurable]]: false }を返す
- OrdinaryGetOwnProperty(O, P)を返す
9.4.5.2 [[HasProperty]] ( P )
Integer-IndexedエキゾチックオブジェクトOの[[HasProperty]]内部メソッドがプロパティキーPで呼び出されると、次の手順が実行されます。
- Assert: IsPropertyKey(P) は true
- Assert: O は Integer-Indexedエキゾチックオブジェクト
- Type(P) が String型なら、
- ! CanonicalNumericIndexString(P) を numericIndex とする
- numericIndex が undefined でないなら、
- O.[[ViewedArrayBuffer]] を buffer とする
- IsDetachedBuffer(buffer) が true なら、 TypeError例外をスローする
- ! IsValidIntegerIndex(O, numericIndex) が false なら、 false を返す
- true を返す
- ? OrdinaryHasProperty(O, P)を返す
9.4.5.3 [[DefineOwnProperty]] ( P, Desc )
Integer-IndexedエキゾチックオブジェクトOの[[DefineOwnProperty]]内部メソッドがプロパティキーPとプロパティ記述子Descで呼び出されると、次の手順が実行されます。
- Assert: IsPropertyKey(P) は true
- Assert: O は Integer-Indexedエキゾチックオブジェクト
- Type(P) が String型なら、
- ! CanonicalNumericIndexString(P) を numericIndex とする
- numericIndex が undefined でないなら、
- ! IsValidIntegerIndex(O, numericIndex) が false なら、 false を返す
- IsAccessorDescriptor(Desc) が true なら、 false を返す
- Desc が [[Configurable]]フィールドを持っていて、Desc.[[Configurable]] が true なら、false を返す
- Desc が [[Enumerable]]フィールドを持っていて、 Desc.[[Enumerable]] が false なら、 false を返す
- Desc が [[Writable]]フィールドを持っていて、Desc.[[Writable]] が false なら、 false を返す
- Desc が [[Value]]フィールドを持っているなら、
- Desc.[[Value]] を value とする
- ? IntegerIndexedElementSet(O, numericIndex, value)を返す
- true を返す
- ! OrdinaryDefineOwnProperty(O, P, Desc)を返す
9.4.5.4 [[Get]] ( P, Receiver )
Integer-IndexedエキゾチックオブジェクトOの[[Get]]内部メソッドがプロパティキーPおよびECMAScript言語値Receiverで呼び出されると、次の手順が実行されます。
- Assert: IsPropertyKey(P) は true
- Type(P) が String型なら
- ! CanonicalNumericIndexString(P) を numericIndex とする
- numericIndex が undefined でないなら、
- ? IntegerIndexedElementGet(O, numericIndex)を返す
- ? OrdinaryGet(O, P, Receiver)を返す
9.4.5.5 [[Set]] ( P, V, Receiver )
Integer-IndexedエキゾチックオブジェクトOの[[Set]]内部メソッドがプロパティキーP、値V、およびECMAScript言語値Receiverで呼び出されると、次の手順が実行されます。
- Assert: IsPropertyKey(P) は true
- If Type(P) が String型なら、
- ! CanonicalNumericIndexString(P) を numericIndex とする
- numericIndex が undefined でないなら、
- ? IntegerIndexedElementSet(O, numericIndex, V)を返す
- ? OrdinarySet(O, P, V, Receiver)を返す
9.4.5.6 [[OwnPropertyKeys]] ( )
Integer-IndexedエキゾチックオブジェクトOの[[OwnPropertyKeys]]内部メソッドが呼び出されると、次の手順が実行されます。
9.4.5.7 IntegerIndexedObjectCreate ( prototype )
抽象操作IntegerIndexedObjectCreateは、新しいInteger-Indexedエキゾチックオブジェクトを作成します。 IntegerIndexedObjectCreateは、次の手順を実行します。
- « [[Prototype]], [[Extensible]], [[ViewedArrayBuffer]], [[TypedArrayName]], [[ContentType]], [[ByteLength]], [[ByteOffset]], [[ArrayLength]] » を internalSlotsList とする
- ! MakeBasicObject(internalSlotsList) を A とする
- 9.4.5.1の処理を A.[[GetOwnProperty]] にセット
- 9.4.5.2の処理を A.[[HasProperty]] にセット
- 9.4.5.3の処理を A.[[DefineOwnProperty]] にセット
- 9.4.5.4の処理を A.[[Get]] にセット
- 9.4.5.5の処理を A.[[Set]] にセット
- 9.4.5.6の処理を A.[[OwnPropertyKeys]] as specified in
- prototype を A.[[Prototype]] にセットする
- Aを返す
9.4.5.8 IsValidIntegerIndex ( O, index )
引数Oとindexを指定した抽象操作IsValidIntegerIndexは、次の手順を実行します。
9.4.5.9 IntegerIndexedElementGet ( O, index )
引数Oとindexを指定した抽象操作IntegerIndexedElementGetは、次の手順を実行します。
- Assert: O は Integer-Indexedエキゾチックオブジェクト
- Assert: Type(index) は Number型
- O.[[ViewedArrayBuffer]] を buffer とする
- IsDetachedBuffer(buffer) が true なら、TypeError例外をスローする
- ! IsValidIntegerIndex(O, index) が false なら、 undefined を返す
- O.[[ByteOffset]] を offset とする
- O.[[TypedArrayName]] の文字列値を arrayTypeName とする
- 表61 で arrayTypeName に対応する要素サイズを elementSize とする
- (index × elementSize) + offset を indexedPosition とする
- 表61 で arrayTypeName に対応する要素型 を elementType とする
- GetValueFromBuffer(buffer, indexedPosition, elementType, true, Unordered)を返す
9.4.5.10 IntegerIndexedElementSet ( O, index, value )
引数O、index、およびvalueを持つ抽象操作IntegerIndexedElementSetは、次の手順を実行します。
- Assert: O は Integer-Indexedエキゾチックオブジェクト
- Assert: Type(index) は Number型
- O.[[ContentType]] が BigInt なら、 ? ToBigInt(value) を numValue とする
- 3. でないなら、 ? ToNumber(value) を numValue とする
- O.[[ViewedArrayBuffer]] を buffer とする
- IsDetachedBuffer(buffer) が true なら、 TypeError例外をスローする
- ! IsValidIntegerIndex(O, index) が false なら、 false を返す
- O.[[ByteOffset]] を offset とする
- O.[[TypedArrayName]] の文字列値を arrayTypeName とする
- 表61 で arrayTypeName に対応する要素サイズ を elementSize とする
- (index × elementSize) + offset を indexedPosition とする
- 表61 で arrayTypeName に対応する要素型 を elementType とする
- SetValueInBuffer(buffer, indexedPosition, elementType, numValue, true, Unordered)を実行
- true を返す
9.4.6 モジュールネームスペースエキゾチックオブジェクト(Module Namespace Exotic Objects)
モジュールネームスペース(名前空間)エキゾチックオブジェクトは、ECMAScriptモジュールからエクスポートされたバインディングを公開するエキゾチックオブジェクトです(15.2.3を参照)。モジュールネームスペースエキゾチックオブジェクトの文字列キーの独自プロパティと、モジュールによってエクスポートされたバインディング名は1対1で対応しています。エクスポートされたバインディングには、export * exportアイテムを使用して間接的にエクスポートされたバインディングが含まれます。 各文字列値の独自のプロパティキーは、対応するエクスポートされたバインディング名のStringValueです。これらは、モジュールネームスペースエキゾチックオブジェクトの唯一の文字列キープロパティです。 そのような各プロパティには、属性{[[Writable]]:true,[[Enumerable]]:true,[[Configurable]]:false}があります。 モジュールネームスペースエキゾチックオブジェクトは拡張できません。
以下で定義している[[SetPrototypeOf]]、 [[IsExtensible]]、 [[PreventExtensions]]、 [[GetOwnProperty]]、 [[DefineOwnProperty]]、 [[HasProperty]]、 [[Get]]、 [[Set]]、 [[Delete]]、 および[[OwnPropertyKeys]]内部メソッドと、9.1にあるその他の重要な内部メソッドを持つオブジェクトはモジュールネームスペースエキゾチックオブジェクトです。これらのメソッドは、ModuleNamespaceCreateでインストールされます。
モジュールネームスペースエキゾチックオブジェクトには、表29で定義されている内部スロットがあります。
内部スロット | 型 | 内容 |
---|---|---|
[[Module]] | モジュールレコード | 名前空間をエクスポートするモジュールレコード。 |
[[Exports]] | String型のList | オブジェクトの独自のプロパティとして公開される、エクスポートされた名前の文字列値リスト。 リストは、引数comparefnにundefinedを指定したArray.prototype.sortを使用してソートされたかのように順序付けられます。 |
[[Prototype]] | Null | このスロットの値は常にnullです(9.4.6.1を参照)。 |
モジュールネームスペースエキゾチックオブジェクトは、[[GetPrototypeOf]]を除くすべての内部メソッドの代替定義を提供します。これは、9.1.1で定義されたとおりに動作します。
9.4.6.1 [[SetPrototypeOf]] ( V )
モジュールネームスペースエキゾチックオブジェクトOの[[SetPrototypeOf]]内部メソッドが引数Vで呼び出されると、次の手順が実行されます。
- ? SetImmutablePrototype(O, V)を返す
9.4.6.2 [[IsExtensible]] ( )
モジュールネームスペースエキゾチックオブジェクトOの[[IsExtensible]]内部メソッドが呼び出されると、次の手順が実行されます。
- false を返す
9.4.6.3 [[PreventExtensions]] ( )
モジュールネームスペースエキゾチックオブジェクトOの[[PreventExtensions]]内部メソッドが呼び出されると、次の手順が実行されます。
- true を返す
9.4.6.4 [[GetOwnProperty]] ( P )
モジュールネームスペースエキゾチックオブジェクトOの[[GetOwnProperty]]内部メソッドがプロパティキーPで呼び出されると、次の手順が実行されます。
- Type(P) が Symbol型なら、OrdinaryGetOwnProperty(O, P)を返す
- O.[[Exports]] を exports とする
- P が exports の要素でないなら、 undefined を返す
- ? O.[[Get]](P, O) を value とする
- プロパティ記述子{ [[Value]]: value, [[Writable]]: true, [[Enumerable]]: true, [[Configurable]]: false }を返す
9.4.6.5 [[DefineOwnProperty]] ( P, Desc )
モジュールネームスペースエキゾチックオブジェクトOの[[DefineOwnProperty]]内部メソッドがプロパティキーPとプロパティ記述子Descで呼び出されると、次の手順が実行されます。
- Type(P) が Symbol型なら、OrdinaryDefineOwnProperty(O, P, Desc)を返す
- ? O.[[GetOwnProperty]](P) を current とする
- current が undefined なら、 false を返す
- IsAccessorDescriptor(Desc) が true なら、 false を返す
- Desc.[[Writable]] が存在し、値が false なら、 false を返す
- Desc.[[Enumerable]] が存在し、値が false なら、 false を返す
- Desc.[[Configurable]] が存在し、値が true なら、 false を返す
- Desc.[[Value]] が存在するなら、 SameValue(Desc.[[Value]], current.[[Value]])を返す
- true を返す
9.4.6.6 [[HasProperty]] ( P )
モジュールネームスペースエキゾチックオブジェクトOの[[HasProperty]]内部メソッドがプロパティキーPで呼び出されると、次の手順が実行されます。
- Type(P) が Symbol型なら、 OrdinaryHasProperty(O, P)を返す
- O.[[Exports]] を exports とする
- P が exports の要素なら、 true を返す
- false を返す
9.4.6.7 [[Get]] ( P, Receiver )
モジュールネームスペースエキゾチックオブジェクトOの[[Get]]内部メソッドがプロパティキーPおよびECMAScript言語値Receiverで呼び出されると、次の手順が実行されます。
- Assert: IsPropertyKey(P) は true
- Type(P) が Symbol型なら、
- ? OrdinaryGet(O, P, Receiver)を返す
- O.[[Exports]] を exports とする
- P が exports の要素でないなら、 undefined を返す
- O.[[Module]] を m とする
- ! m.ResolveExport(P) を binding とする
- Assert: binding は ResolvedBindingレコード
- binding.[[Module]] を targetModule とする
- Assert: targetModule は undefined ではない
- binding.[[BindingName]] が "*namespace*" なら
- ? GetModuleNamespace(targetModule)を返す
- targetModule.[[Environment]] を targetEnv とする
- targetEnv が undefined なら、ReferenceError例外をスローする
- targetEnvの EnvironmentRecord を targetEnvRec とする
- ? targetEnvRec.GetBindingValue(binding.[[BindingName]], true)を返す
9.4.6.8 [[Set]] ( P, V, Receiver )
モジュールネームスペースエキゾチックオブジェクトOの[[Set]]内部メソッドがプロパティキーP、値V、およびECMAScript言語値Receiverで呼び出されると、次の手順が実行されます。
- false を返す
9.4.6.9 [[Delete]] ( P )
モジュールネームスペースエキゾチックオブジェクトOの[[Delete]]内部メソッドがプロパティキーPで呼び出されると、次の手順が実行されます。
- Assert: IsPropertyKey(P) は true
- If Type(P) Symbol型なら、
- ? OrdinaryDelete(O, P)を返す
- O.[[Exports]] を exports とする
- P が exports の要素なら、 false を返す
- true を返す
9.4.6.10 [[OwnPropertyKeys]] ( )
モジュールネームスペースエキゾチックオブジェクトOの[[OwnPropertyKeys]]内部メソッドが呼び出されると、次の手順が実行されます。
- O.[[Exports]] のコピーを exports とする
- ! OrdinaryOwnPropertyKeys(O) を symbolKeys とする
- symbolKeys のすべての要素を exports の最後に追加する
- exportsを返す
9.4.6.11 ModuleNamespaceCreate ( module, exports )
引数moduleとexportsで抽象操作ModuleNamespaceCreateを呼び出すと、新しいモジュールネームスペースエキゾチックオブジェクトを作成します。 次の手順を実行します。
- Assert: module は モジュールレコード
- Assert: module.[[Namespace]] は undefined
- Assert: exports は 文字列値のリスト
- 表29の内部スロットを internalSlotsList とする
- ! MakeBasicObject(internalSlotsList) を M とする
- 9.4.6の内部メソッドを M の重要な内部メソッドとしてセットする
- null を M.[[Prototype]] にセットする
- module を M.[[Module]] にセットする
- exportsと同じ値を含む新規リストを sortedExports とする。ただし、仮引数comparefnにundefinedを指定したArray.prototype.sortでソートしたときと同じ順番で順位付ける。
- sortedExports を M.[[Exports]] にセットする
- 26.3の定義に対応する独自プロパティを M に作成する
- M を module.[[Namespace]] にセットする
- Mを返す
9.4.7 イミュータブルプロトタイプエキゾチックオブジェクト(Immutable Prototype Exotic Objects)
イミュータブル(不変)プロトタイプエキゾチックオブジェクトは、[[Prototype]]内部スロットを持ち、一度初期化すると変更されないエキゾチックオブジェクトです。
[[SetPrototypeOf]]内部メソッドがこの後定義している実装を使用する場合、オブジェクトはイミュータブルプロトタイプエキゾチックオブジェクトです。 個々のイミュータブルプロトタイプエキゾチックオブジェクトに応じて、他の重要な内部メソッドは任意の実装を使用できます。
9.4.7.1 [[SetPrototypeOf]] ( V )
イミュータブルプロトタイプエキゾチックオブジェクトOの[[SetPrototypeOf]]内部メソッドが引数Vで呼び出されると、次の手順が実行されます。
- ? SetImmutablePrototype(O, V)を返す
9.4.7.2 SetImmutablePrototype ( O, V )
引数OおよびVを指定してSetImmutablePrototype抽象操作が呼び出されると、次の手順が実行されます。
9.5 プロキシオブジェクトの内部メソッドと内部スロット(Proxy Object Internal Methods and Internal Slots)
Proxyエキゾチックオブジェクト
プロキシオブジェクトはエキゾチックなオブジェクトであり、その基本的な内部メソッドはECMAScriptコードを使用して部分的に実装されています。 すべてのプロキシオブジェクトには、[[ProxyHandler]]という内部スロットがあります。 [[ProxyHandler]]の値は、プロキシのハンドラオブジェクトと呼ばれるオブジェクト、またはnullです。 ハンドラーオブジェクトのメソッド(表30を参照)を使用して、1つ以上のプロキシオブジェクトの内部メソッドの実装を強化できます。 すべてのプロキシオブジェクトには、[[ProxyTarget]]という内部スロットもあり、その値はオブジェクトまたはnull値です。 このオブジェクトは、プロキシのターゲットオブジェクトと呼ばれます。
重要な内部メソッド([[Call]]と該当する場合は[[Construct]]を含む)がこのセクションの定義を使用する場合、オブジェクトはプロキシエキゾチックオブジェクトです。 これらの内部メソッドはProxyCreateでインストールされます。
内部メソッド | ハンドラーメソッド |
---|---|
[[GetPrototypeOf]] | getPrototypeOf |
[[SetPrototypeOf]] | setPrototypeOf |
[[IsExtensible]] | isExtensible |
[[PreventExtensions]] | preventExtensions |
[[GetOwnProperty]] | getOwnPropertyDescriptor |
[[DefineOwnProperty]] | defineProperty |
[[HasProperty]] | has |
[[Get]] | get |
[[Set]] | set |
[[Delete]] | deleteProperty |
[[OwnPropertyKeys]] | ownKeys |
[[Call]] | apply |
[[Construct]] | construct |
プロキシオブジェクトの内部メソッドの実装を提供するハンドラメソッドが呼び出されると、ハンドラーメソッドにプロキシーのターゲットオブジェクトがパラメーターとして渡されます。
ハンドラーメソッドを呼び出してプロキシオブジェクトの内部メソッドを実装すると、ハンドラーメソッドにプロキシーのターゲットオブジェクトがパラメーターとして渡されます。 プロキシのハンドラオブジェクトには、必ずしもすべての必須内部メソッドに対応するメソッドがあるとは限りません。 ハンドラーオブジェクトに内部トラップに対応するメソッドがない場合、プロキシのターゲットオブジェクトに対応する内部メソッドが呼び出されます。
プロキシオブジェクトの[[ProxyHandler]]および[[ProxyTarget]]内部スロットは、オブジェクト作成時に常に初期化され、その後の変更は通常できません。 一部のプロキシオブジェクトは、後で取り消されるように作成されます。 プロキシが取り消されると、その[[ProxyHandler]]および[[ProxyTarget]]内部スロットがnullに設定され、後でプロキシオブジェクトの内部メソッドを呼び出すとTypeError例外がスローされます。
プロキシオブジェクトは、内部メソッドの実装を任意のECMAScriptコードで提供できます。そのためプロキシオブジェクトに、6.1.7.3で定義されている不変条件に違反するハンドラメソッドを定義することが可能です。 6.1.7.3で定義されている内部メソッド不変式の一部は、本質的な完全性不変式です。 これらの不変条件は、このセクションで指定されたプロキシオブジェクトの内部メソッドによって明示的に適用されます。 ECMAScript実装は、起こり得るすべての不変の違反が存在する場合でも堅牢でなければなりません。
次のアルゴリズムの説明では、OがECMAScriptプロキシオブジェクト、Pがプロパティキー値、Vが任意のECMAScript言語値、Descがプロパティ記述子レコードであると想定しています。
9.5.1 [[GetPrototypeOf]] ( )
プロキシエキゾチックオブジェクトOの[[GetPrototypeOf]]内部メソッドが呼び出されると、次の手順が実行されます。
- O.[[ProxyHandler]] を handler とする
- handler が null なら、 TypeError例外をスローする
- Assert: Type(handler) は Object型
- O.[[ProxyTarget]] を target とする
- ? GetMethod(handler, "getPrototypeOf") を trap とする
- trap が undefined なら、
- ? target.[[GetPrototypeOf]]()を返す
- ? Call(trap, handler, « target ») を handlerProto とする
- Type(handlerProto) が Object型 または Null以外なら、 TypeError例外をスローする
- ? IsExtensible(target) を extensibleTarget とする
- extensibleTarget が true なら、 handlerProto を返す
- ? target.[[GetPrototypeOf]]() を targetProto とする
- SameValue(handlerProto, targetProto) が false なら、 TypeError例外をスローする
- handlerProtoを返す
- [[GetPrototypeOf]]の結果は、Objectまたはnullのいずれかである必要があります。
- ターゲットオブジェクトが拡張可能でない場合、プロキシオブジェクトに適用された[[GetPrototypeOf]]は、プロキシオブジェクトのターゲットオブジェクトに適用された[[GetPrototypeOf]]と同じ値を返す必要があります。
9.5.2 [[SetPrototypeOf]] ( V )
引数Vを指定してProxyエキゾチックオブジェクトOの[[SetPrototypeOf]]内部メソッドが呼び出されると、次の手順が実行されます。
- Assert: Type(V) は Object型か Null
- O.[[ProxyHandler]] を handler とする
- handler が null なら、TypeError例外をスローする
- Assert: Type(handler) は Object型
- O.[[ProxyTarget]] を target とする
- ? GetMethod(handler, "setPrototypeOf") を trap とする
- trap が undefined なら、
- ? target.[[SetPrototypeOf]](V)を返す
- ! ToBoolean(?Call(trap, handler, « target, V »)) を booleanTrapResult とする
- booleanTrapResult が false なら、 false を返す
- ? IsExtensible(target) を extensibleTarget とする
- extensibleTarget が true なら、 true を返す
- ? target.[[GetPrototypeOf]]() を targetProto とする
- SameValue(V, targetProto) が false なら、TypeError例外をスローする
- true を返す
- [[SetPrototypeOf]]の結果はブール値です。
- ターゲットオブジェクトが拡張可能でない場合、引数値は、ターゲットオブジェクトに適用された[[GetPrototypeOf]]の結果と同じでなければなりません。
9.5.3 [[IsExtensible]] ( )
プロキシエキゾチックオブジェクトOの[[IsExtensible]]内部メソッドが呼び出されると、次の手順が実行されます。
- O.[[ProxyHandler]] を handler とする
- handler が null なら、TypeError例外をスローする
- Assert: Type(handler) は Object型
- O.[[ProxyTarget]] を target とする
- ? GetMethod(handler, "isExtensible") を trap とする
- trap が undefined なら、
- ? IsExtensible(target)を返す
- ! ToBoolean(?Call(trap, handler, « target »)) を booleanTrapResult とする
- ? IsExtensible(target) を targetResult とする
- SameValue(booleanTrapResult, targetResult) が false なら、TypeError例外をスローする
- booleanTrapResultを返す
- [[IsExtensible]]の結果はブール値です。
- プロキシオブジェクトに適用される[[IsExtensible]]は、同じ引数でプロキシオブジェクトのターゲットオブジェクトに適用される[[IsExtensible]]と同じ値を返す必要があります。
9.5.4 [[PreventExtensions]] ( )
プロキシエキゾチックオブジェクトOの[[PreventExtensions]]内部メソッドが呼び出されると、次の手順が実行されます。
- O.[[ProxyHandler]] を handler とする
- handler が null なら、TypeError例外をスローする
- Assert: Type(handler) は Object型
- O.[[ProxyTarget]] を target とする
- ? GetMethod(handler, "preventExtensions") を trap とする
- trap が undefined なら、
- ? target.[[PreventExtensions]]()を返す
- ! ToBoolean(?Call(trap, handler, « target »)) を booleanTrapResult とする
- booleanTrapResult が true なら、
- ? IsExtensible(target) を extensibleTarget とする
- extensibleTarget が true なら、TypeError例外をスローする
- booleanTrapResultを返す
- [[PreventExtensions]]の結果はブール値です。
- プロキシオブジェクトに適用された[[PreventExtensions]]は、プロキシオブジェクトのターゲットオブジェクトに適用された[[IsExtensible]]がfalseの場合にのみtrueを返します。
9.5.5 [[GetOwnProperty]] ( P )
プロキシエキゾチックオブジェクトOの[[GetOwnProperty]]内部メソッドがプロパティキーPで呼び出されると、次の手順が実行されます。
- Assert: IsPropertyKey(P) は true
- O.[[ProxyHandler]] を handler とする
- handler が null なら、TypeError例外をスローする
- Assert: Type(handler) は Object型
- O.[[ProxyTarget]] を target とする
- ? GetMethod(handler, "getOwnPropertyDescriptor") を trap とする
- trap が undefined なら、
- ? target.[[GetOwnProperty]](P)を返す
- ?Call(trap, handler, « target, P ») を trapResultObj とする
- Type(trapResultObj) が Object型またはUndefined以外なら、 TypeError例外をスローする
- ? target.[[GetOwnProperty]](P) を targetDesc とする
- trapResultObj が undefined なら、
- targetDesc が undefined なら、 undefined を返す
- targetDesc.[[Configurable]] が false なら、TypeError例外をスローする
- ? IsExtensible(target) を extensibleTarget とする
- extensibleTarget が false なら、TypeError例外をスローする
- undefined を返す
- ? IsExtensible(target) を extensibleTarget とする
- ? ToPropertyDescriptor(trapResultObj) を resultDesc とする
- CompletePropertyDescriptor(resultDesc)を呼び出す
- IsCompatiblePropertyDescriptor(extensibleTarget, resultDesc, targetDesc) を valid とする
- valid が false なら、TypeError例外をスローする
- resultDesc.[[Configurable]] が false なら、
- targetDesc が undefined または targetDesc.[[Configurable]] が true なら、
- TypeError例外をスローする
- resultDescが [[Writable]]フィールドを持っていて、resultDesc.[[Writable]] が false なら、
- targetDesc.[[Writable]] が true なら、TypeError例外をスローする
- targetDesc が undefined または targetDesc.[[Configurable]] が true なら、
- resultDescを返す
- [[GetOwnProperty]]の結果は、オブジェクトかundefinedでなければなりません。
- プロパティが、ターゲットオブジェクトの構成不可能な独自のプロパティとして存在する場合、"プロパティが存在しない"と報告できません。
- ターゲットオブジェクトが拡張可能でなく、ターゲットオブジェクトの独自プロパティとして存在しない限り、"プロパティが存在しない"と報告できません。
- ターゲットオブジェクトが拡張可能でなく、ターゲットオブジェクトの独自プロパティとして存在しない限り、"プロパティが存在する"として報告できません。
- プロパティが、ターゲットオブジェクトの設定不可能な独自プロパティとして存在しない限り、"設定不可"として報告できません。
- プロパティが、ターゲットオブジェクトの設定および書き込みができない独自プロパティとして存在しない限り、"設定および書き込みができない"と報告することはできません。
9.5.6 [[DefineOwnProperty]] ( P, Desc )
プロキシエキゾチックオブジェクトOの[[DefineOwnProperty]]内部メソッドがプロパティキーPとプロパティ記述子Descで呼び出されると、次の手順が実行されます。
- Assert: IsPropertyKey(P) は true
- O.[[ProxyHandler]] を handler とする
- handler が null なら、TypeError例外をスローする
- Assert: Type(handler) は Object型
- O.[[ProxyTarget]] を target とする
- ? GetMethod(handler, "defineProperty") を trap とする
- trap が undefined なら、
- ? target.[[DefineOwnProperty]](P, Desc)を返す
- FromPropertyDescriptor(Desc) を descObj とする
- ! ToBoolean(?Call(trap, handler, « target, P, descObj »)) を booleanTrapResult とする
- booleanTrapResult が false なら、 false を返す
- ? target.[[GetOwnProperty]](P) を targetDesc とする
- ? IsExtensible(target) を extensibleTarget とする
- Desc が [[Configurable]]フィールドを持っていて、Desc.[[Configurable]] が false なら、
- true を settingConfigFalse とする
- 13.でないなら false を settingConfigFalse とする
- targetDesc が undefined なら、
- extensibleTarget が false なら、TypeError例外をスローする
- settingConfigFalse が true なら、TypeError例外をスローする
- 15. でないなら、
- IsCompatiblePropertyDescriptor(extensibleTarget, Desc, targetDesc) が false なら、TypeError例外をスローする
- settingConfigFalse が true で targetDesc.[[Configurable]] が true なら、TypeError例外をスローする
- IsDataDescriptor(targetDesc) が true で targetDesc.[[Configurable]] が false で、targetDesc.[[Writable]] が true なら、
- Desc が [[Writable]]フィールドを持っていて、 Desc.[[Writable]] が false なら、TypeError例外をスローする
- true を返す
- [[DefineOwnProperty]]の結果はブール値です。
- ターゲットオブジェクトが拡張可能でない場合、プロパティを追加できません。
- ターゲットオブジェクトに対応する設定不可能な独自プロパティが存在しない限り、プロパティを設定不可にすることはできません。
- ターゲットオブジェクトに対応する設定不可能で書き込み不可能な独自プロパティが存在しない限り、設定不可能なプロパティは書き込み不可にすることはできません。
- プロパティに対応するターゲットオブジェクトプロパティがある場合、[[DefineOwnProperty]]を使用してプロパティのプロパティ記述子をターゲットオブジェクトに適用しても、例外はスローされません。
9.5.7 [[HasProperty]] ( P )
プロキシエキゾチックオブジェクトOの[[HasProperty]]内部メソッドがプロパティキーPで呼び出されると、次の手順が実行されます。
- Assert: IsPropertyKey(P) は true
- O.[[ProxyHandler]] を handler とする
- handler が null なら、TypeError例外をスローする
- Assert: Type(handler) は Object型
- O.[[ProxyTarget]] を target とする
- ? GetMethod(handler, "has") を trap とする
- trap が undefined なら、
- ? target.[[HasProperty]](P)を返す
- ! ToBoolean(?Call(trap, handler, « target, P »)) を booleanTrapResult とする
- booleanTrapResult が false なら、
- ? target.[[GetOwnProperty]](P) を targetDesc とする
- targetDesc が undefined でないなら、
- targetDesc.[[Configurable]] が false なら、TypeError例外をスローする
- ? IsExtensible(target) を extensibleTarget とする
- extensibleTarget が false なら、TypeError例外をスローする
- booleanTrapResultを返す
- [[HasProperty]]の結果はブール値です。
- プロパティは、ターゲットオブジェクトの構成不可能な独自プロパティとして存在する場合、存在しないと報告できません。
- プロパティは、ターゲットオブジェクトの独自プロパティとして存在し、ターゲットオブジェクトが拡張可能でない場合、存在しないと報告できません。
9.5.8 [[Get]] ( P, Receiver )
プロキシエキゾチックオブジェクトOの[[Get]]内部メソッドがプロパティキーPおよびECMAScript言語値Receiverで呼び出されると、次の手順が実行されます。
- Assert: IsPropertyKey(P) は true
- O.[[ProxyHandler]] を handler とする
- handler が null なら、TypeError例外をスローする
- Assert: Type(handler) は Object型
- O.[[ProxyTarget]] を target とする
- ? GetMethod(handler, "get") を trap とする
- trap が undefined なら、
- ? target.[[Get]](P, Receiver)を返す
- ?Call(trap, handler, « target, P, Receiver ») を trapResult とする
- ? target.[[GetOwnProperty]](P) を targetDesc とする
- targetDesc が undefined ではなく、 targetDesc.[[Configurable]] が false なら、
- IsDataDescriptor(targetDesc) が true で targetDesc.[[Writable]] が false なら、
- SameValue(trapResult, targetDesc.[[Value]]) が false なら、TypeError例外をスローする
- IsAccessorDescriptor(targetDesc) が true で、 targetDesc.[[Get]] が undefined なら、
- trapResult が undefined でないなら、TypeError例外をスローする
- IsDataDescriptor(targetDesc) が true で targetDesc.[[Writable]] が false なら、
- trapResultを返す
- プロパティについて報告される値は、ターゲットオブジェクトプロパティが書き込みおよび設定ができない独自データプロパティである場合、対応するターゲットオブジェクトプロパティの値と同じでなければなりません。
- 対応するターゲットオブジェクトプロパティが、[[Get]]属性としてundefinedの設定不可能な独自アクセサープロパティである場合、プロパティについて報告される値はundefinedでなければなりません。
9.5.9 [[Set]] ( P, V, Receiver )
プロキシエキゾチックオブジェクトOの[[Set]]内部メソッドがプロパティキーP、値V、およびECMAScript言語値Receiverで呼び出されると、次の手順が実行されます。
- Assert: IsPropertyKey(P) は true
- O.[[ProxyHandler]] を handler とする
- handler が null なら、TypeError例外をスローする
- Assert: Type(handler) は Object型
- O.[[ProxyTarget]] を target とする
- ? GetMethod(handler, "set") を trap とする
- trap が undefined なら、
- ? target.[[Set]](P, V, Receiver)を返す
- ! ToBoolean(?Call(trap, handler, « target, P, V, Receiver »)) を booleanTrapResult とする
- booleanTrapResult が false なら、 false を返す
- ? target.[[GetOwnProperty]](P) を targetDesc とする
- targetDesc が undefined ではなく、targetDesc.[[Configurable]] が false なら、
- IsDataDescriptor(targetDesc) が true で targetDesc.[[Writable]] が false なら、
- SameValue(V, targetDesc.[[Value]]) が false なら、TypeError例外をスローする
- IsAccessorDescriptor(targetDesc) が true なら、
- targetDesc.[[Set]] が undefined なら、TypeError例外をスローする
- IsDataDescriptor(targetDesc) が true で targetDesc.[[Writable]] が false なら、
- true を返す
- [[Set]]の結果はブール値です。
- 対応するターゲットオブジェクトプロパティが、書き込み不可の構成可能な独自のデータプロパティである場合、プロパティの値を、対応するターゲットオブジェクトプロパティの値と異なる値に変更することはできません。
- 対応するターゲットオブジェクトプロパティが [Set] 属性として定義されていない、構成可能でない独自のアクセサープロパティである場合は、プロパティの値を設定できません。
9.5.10 [[Delete]] ( P )
プロキシエキゾチックオブジェクトOの[[Delete]]内部メソッドがプロパティキーPで呼び出されると、次の手順が実行されます。
- Assert: IsPropertyKey(P) は true
- O.[[ProxyHandler]] を handler とする
- handler が null なら、TypeError例外をスローする
- Assert: Type(handler) は Object型
- O.[[ProxyTarget]] を target とする
- ? GetMethod(handler, "deleteProperty") を trap とする
- trap が undefined なら、
- ? target.[[Delete]](P)を返す
- ! ToBoolean(?Call(trap, handler, « target, P »)) を booleanTrapResult とする
- booleanTrapResult が false なら、 false を返す
- ? target.[[GetOwnProperty]](P) を targetDesc とする
- targetDesc が undefined なら、 true を返す
- targetDesc.[[Configurable]] が false なら、TypeError例外をスローする
- ? IsExtensible(target) を extensibleTarget とする
- extensibleTarget が false なら、TypeError例外をスローする
- true を返す
- [[Delete]]の結果はブール値です。
- プロパティが、ターゲットオブジェクトの構成不可能な独自プロパティとして存在する場合、削除済みとして報告することはできません。
- プロパティがターゲットオブジェクトの独自プロパティとして存在し、ターゲットオブジェクトが拡張不可能である場合、プロパティを削除済みとして報告することはできません。
9.5.11 [[OwnPropertyKeys]] ( )
プロキシエキゾチックオブジェクトOの[[OwnPropertyKeys]]内部メソッドが呼び出されると、次の手順が実行されます。
- O.[[ProxyHandler]] を handler とする
- handler が null なら、TypeError例外をスローする
- Assert: Type(handler) は Object型
- O.[[ProxyTarget]] を target とする
- ? GetMethod(handler, "ownKeys") を trap とする
- trap が undefined なら、
- ? target.[[OwnPropertyKeys]]()を返す
- ?Call(trap, handler, « target ») を trapResultArray とする
- ? CreateListFromArrayLike(trapResultArray, « String, Symbol ») を trapResult とする
- trapResult に重複するエントリが含まれている場合 TypeError例外をスローする
- ? IsExtensible(target) を extensibleTarget とする
- ? target.[[OwnPropertyKeys]]() を targetKeys とする
- Assert: targetKeys は、文字列とシンボルの値のみを含むリスト
- Assert: targetKeys には、重複エントリがない
- 空の新規List を targetConfigurableKeys とする
- 空の新規List を targetNonconfigurableKeys とする
- targetKeysの要素をkeyとして、keyごとに、
- ? target.[[GetOwnProperty]](key) を desc とする
- desc が undefined でなく desc.[[Configurable]] が false なら、
- targetNonconfigurableKeysの要素としてkeyを追加する
- b. でないなら、
- targetConfigurableKeysの要素としてkeyを追加する
- extensibleTarget が true で targetNonconfigurableKeys が empty なら、
- trapResultを返す
- trapResultのコピーである新しいリスト を uncheckedResultKeys とする
- targetNonconfigurableKeysの要素をkeyとして、各keyに対して、
- keyがuncheckedResultKeysの要素ではないなら、 TypeError例外をスローする
- uncheckedResultKeysから、keyを削除する
- extensibleTarget が true なら、trapResultを返す
- targetConfigurableKeysの要素をkeyとして、各keyに対して、
- keyがuncheckedResultKeysの要素ではないなら、 TypeError例外をスローする
- uncheckedResultKeysから、keyを削除する
- uncheckedResultKeys が empty でないなら、 TypeError例外をスローする
- trapResultを返す
- [[OwnPropertyKeys]] の結果はリストです。
- 返されたリストには重複するエントリはありません。
- 各結果リストの要素の型はStringまたはSymbolです。
- 結果リストには、ターゲットオブジェクトのすべての構成不可能な独自プロパティのキーが含まれている必要があります。
- ターゲット オブジェクトが拡張できない場合、結果リスト には、ターゲットオブジェクトの独自プロパティのすべてのキーが含まれ、その他の値は含まれていない必要があります。
9.5.12 [[Call]] ( thisArgument, argumentsList )
プロキシエキゾチックオブジェクトOの[[Call]]内部メソッドは、パラメーターthisArgumentおよびargumentsListで呼び出されます。 次の手順を実行します。
- O.[[ProxyHandler]] を handler とする
- handler が null なら、TypeError例外をスローする
- Assert: Type(handler) は Object型
- O.[[ProxyTarget]] を target とする
- ? GetMethod(handler, "apply") を trap とする
- trap が undefined なら、
- ! CreateArrayFromList(argumentsList) を argArray とする
- ?Call(trap, handler, « target, thisArgument, argArray »)を返す
9.5.13 [[Construct]] ( argumentsList, newTarget )
プロキシエキゾチックオブジェクトOの[[Construct]]内部メソッドは、ECMAScript言語値の空のリストである可能性のあるargumentsListとnewTargetで呼び出されます。 次の手順を実行します。
- O.[[ProxyHandler]] を handler とする
- handler が null なら、TypeError例外をスローする
- Assert: Type(handler) は Object型
- O.[[ProxyTarget]] を target とする
- Assert: IsConstructor(target) は true
- ? GetMethod(handler, "construct") を trap とする
- trap が undefined なら、
- ! CreateArrayFromList(argumentsList) を argArray とする
- ?Call(trap, handler, « target, argArray, newTarget ») を newObj とする
- Type(newObj) が Object型でないなら、TypeError例外をスローする
- newObjを返す
- [[Construct]]の結果はオブジェクトでなければなりません。
9.5.14 ProxyCreate ( target, handler )
引数targetとhandlerを持つ抽象操作ProxyCreateは、新しいプロキシエキゾチックオブジェクトを作成します。 次の手順を実行します。
- Type(target) が Object型でないなら、TypeError例外をスローする
- target が プロキシエキゾチックオブジェクトで、 target.[[ProxyHandler]] が null なら、TypeError例外をスローする
- Type(handler) が Object型でないなら、TypeError例外をスローする
- handler が プロキシエキゾチックオブジェクトで、 handler.[[ProxyHandler]] が null なら、TypeError例外をスローする
- ! MakeBasicObject(« [[ProxyHandler]], [[ProxyTarget]] ») を P とする
- [[Call]]と[[Construct]]を除いて、9.5で定義されているメソッドを、Pの重要な内部メソッドとして設定する
- IsCallable(target) が true なら、
- 9.5.12の処理を P.[[Call]] にセット
- IsConstructor(target) が true なら、
- 9.5.13の処理を P.[[Construct]] にセット
- target を P.[[ProxyTarget]] にセットする
- handler を P.[[ProxyHandler]] にセットする
- Pを返す