訳の正確性を保証するものではありませんので必要に応じて原文であるEcma InternationalのECMA-262にある ECMA-262.pdf ( ECMA-262 5.1 Edition )を参照下さい。
訳:2012年04月 webzoit.net
次のアルゴリズム説明では、assume O はネイティブなECMAScriptオブジェクト、P はString、Desc はプロパティ記述子レコード、Throw は、Booleanフラグです。
O の[[GetOwnProperty]]内部メソッドが、プロパティ名 P として呼ばれる場合、次のような段階を踏みます。
1. O が名称 P を持つプロパティそれ自身を持たない場合、undefined(未定義)を返す 2. D は、何も項目を持たないプロパティ記述子を新たに生成させる 3. X は、O 自身の名称 P というプロパティにする 4. X が、データプロパティである場合、 a. X の[[Value]]属性の値に D.[[Value]] を設定 b. X の[[Writable]]属性の値に D.[[Writable]] を設定 5.それ以外の場合、 X はアクセサプロパティなので a. X の[[Get]]属性の値に D.[[Get]] を設定 b. X の[[Set]]属性の値に D.[[Set]] を設定 6. X の[[Enumerable]]属性の値に D.[[Enumerable]] を設定 7. X の[[Configurable]]属性の値に D.[[Configurable]] を設定 8. D を返す
しかしながら、もし、 O がStringオブジェクトである場合、それは、15.5.5.2 で定義した、より精巧な[[GetOwnProperty]]内部メソッドを持ちます。
O の[[GetProperty]]内部メソッドが、プロパティ名 P として呼ばれる場合、次のような段階を踏みます。
1.prop は、プロパティ名が P である O の[[GetOwnProperty]]内部メソッドを呼び、それを結果とする 2.prop が、undefined(未定義)でない場合には、prop を返す 3.proto は、O の[[Prototype]]内部メソッドの値とする 4.proto が nullであれば、undefinedを返す 5.引数 P を持つ proto の[[GetProperty]]内部メソッドを呼んだ結果を返す
O の[[Get]]内部メソッドが、プロパティ名 P として呼ばれる場合、次のような段階を踏みます。
1.desc は、プロパティ名 P である O の[[GetProperty]]内部メソッドを呼び、それを結果とする 2.desc が、undefined(未定義)であれば、undefinedを返す 3.IsDataDescriptor(desc)が、trueであれば、desc.[[Value]]を返す 4.それ以外の場合には、IsAccessorDescriptor(desc)はtrueにしなければならない為、getterは、desc.[[Get]]とする 5.getterが、undefined(未定義)であれば、undefinedを返す 6. this 値及び引数なしであるものとして O を提供する getter の[[Call]]内部メソッドを呼んだ結果を返す
O の[[CanPut]]内部メソッドが、プロパティ名 P として呼ばれる場合、次のような段階を踏みます。
1.desc は、引数 P を伴う O の[[GetOwnProperty]]内部メソッドを呼び、それを結果とする 2.desc がundefined(未定義)でない場合には、 a.IsAccessorDescriptor(desc)がtrueであれば i.desc.[[Set]]が、undefinedであれば、falseを返す ii.そうでなければtrueを返す b.それ(a.)以外の場合には、descは、DataDescriptor(データ記述子)にしなければならない為、desc.[[Writable]]という値を返す 3. proto は、O の[[Prototype]]内部メソッドとする 4. proto がnullである場合、O の [[Extensible]]内部プロパティの値を返す 5. inherited は、プロパティ名 P であるprotoの[[Extensible]]内部メソッドを呼び、それを結果とする 6. inherited が、undefinedであれば、O の [[Extensible]]内部プロパティの値を返す 7.IsAccessorDescriptor(inherited) が、trueであれば、 a.inherited.[[Set]]がundefinedであれば、falseを返す b.そうでなければtrueを返す 8.それ以外の場合、inheritedは、DataDescriptor(データ記述子)にしなければならない a. O の[[Extensible]]内部プロパティがfalseであればfalseを返す b.そうではない場合、inherited.[[Writable]]の値を返す
ホストオブジェクトは、[[Put]]演算子に基づく付加的な制約を定義する場合があります。 もし、可能であれば、ホストオブジェクトは、falseを返す[[CanPut]]の当該定義がある状況において[[Put]]演算子を許容すべきではありません。
O の[[Put]]内部メソッドが、プロパティ名 P 、 値 V 、 BooleanフラグがThrowとして呼ばれる場合、次のような段階を踏みます。
1.プロパティ名 P である O の[[CanPut]]内部メソッドを呼んだ結果がfalseである場合、 a.Throwがtrueであれば、TypeError例外を投げる(スローする) b.そうでなければ、単にreturn 2.ownDescは、プロパティ名 P である O の[[GetOwnProperty]]内部メソッドを呼び、それを結果とする 3.IsDataDescriptor(ownDesc) が trueであれば、 a.valueDescは、プロパティ記述子 {[[Value]]: V} とする b.引数である P 、 valueDesc 、Throw を渡すことによって O の[[DefineOwnProperty]]内部メソッドを呼ぶ c.Return 4.descは、引数 P を持つ O の[[GetProperty]]内部メソッドを呼び、それを結果とする。これは、それ自身または継承したアクセサプロパティ記述子や継承したデータプロパティ記述子の何れかになる場合がある。 5.IsAccessorDescriptor(desc) が trueである場合、 a. setter は、undefinedにすることができないdesc.[[Set]]とする b. this 値として O を提供し、唯一の引数として V を提供する setter の[[Call]]内部メソッドを呼ぶ 6.何れでもない場合には、次のようなオブジェクト O について P と名付けられた名前付きデータプロパティを生成する a.newDescは、プロパティ記述子 {[[Value]]: V, [[Writable]]: true, [[Enumerable]]: true, [[Configurable]]: true} とする b.引数である P 、 newDesc 、Throw を渡すことによって O の[[DefineOwnProperty]]内部メソッドを呼ぶ 7.Return
O の[[Put]]内部メソッドが、プロパティ名 P として呼ばれる場合、 O の [[HasProperty]]内部メソッドは、次のような段階を踏みます。
1.descは、プロパティ名 P である O の[[GetProperty]]内部メソッドを呼び、それを結果とする 2.descが、undefinedである場合、falseを返す 3.そうでなければtrueを返す
O の[[Delete]]内部メソッドが、プロパティ名 P 、 BooleanフラグがThrowとして呼ばれる場合、次のような段階を踏みます。
1.descは、プロパティ名 PであるO の[[GetOwnProperty]]内部メソッドを呼び、それを結果とする 2.descが、undefinedである場合、trueを返す 3.desc.[[Configurable]] が trueである場合、 a. O から 名前 P を持つプロパティそれ自身を削除する b.trueを返す 4.何れでもなくThrowが真である場合、TypeError例外を投げる(スローする) 5.falseを返す
O の[[DefaultValue]]内部メソッドが、hint という文字列を伴って呼ばれる場合には、次のような段階を踏みます。
1.toStringは、引数"toString"を伴う オブジェクト O の[[Get]]内部メソッドを呼び、それを結果とする 2.IsCallable(toString) が trueである場合、 a.str は、この値とカラの引数リストとして O を伴う toStringの[[Call]]内部メソッドを呼び、それを結果とする b.str がプリミティブ(原始的な)値である場合、strを返す 3.valueOfは、引数"valueOf"を持つオブジェクト O の[[Get]]内部メソッドを呼び、それを結果とする 4.IsCallable(valueOf) が true である場合、 a.val は、この値とカラの引数リストとして O を持つvalueOfの[[Call]]内部メソッドを呼び、それを結果とする b.val が、プリミティブ(原始的な)値である場合、valを返す 5.TypeError例外を投げる(スローする)
O の[[DefaultValue]]内部メソッドが、hint という数値を伴って呼ばれる場合には、次のような段階を踏みます。
1.valueOfは、引数"valueOf"を持つオブジェクト O の[[Get]]内部メソッドを呼び、それを結果とする 2.IsCallable(valueOf) が trueである場合、 a.val は、この値とカラの引数リストとして O を持つvalueOfの[[Call]]内部メソッドを呼び、それを結果とする b.val が、プリミティブ(原始的な)値である場合、valを返す 3.toStringは、引数"toString"を伴うオブジェクト O の[[Get]]内部メソッドを呼び、それを結果とする 4.IsCallable(toString) が trueである場合、 a.str は、この値とカラの引数リストとして O を持つtoStringの[[Call]]内部メソッドを呼び、それを結果とする b.str が、プリミティブ(原始的な)値である場合、valを返す 5.TypeError例外を投げる(スローする)
O の[[DefaultValue]]内部メソッドが、hint を持たずに呼ばれる場合、O が Dateオブジェクト( 15.9.6 参照)でない限り、hintが文字列であったかのように振る舞うケースについても hint が、数値であったものとして振る舞います。 ネイティブなオブジェクトにおける[[DefaultValue]]の上記仕様は、プリミティブ(原始的な)値だけを返すことが可能です。 もし、ホストオブジェクトが、それ自身の[[DefaultValue]]内部メソッドを実装する場合、それは、その[[DefaultValue]]内部メソッドがプリミティブ(原始的な)値だけを返すことができることを保証しなければいけません。
次のアルゴリズムにある用語"Reject"は、 「もし、Throwがtrueである場合、TypeError例外を投げ、そうでなければ、falseを返す」 という意味です。 そのアルゴリズムは、様々な仕様値におけるProperty Descriptor(プロパティ記述子) Desc という項目をテストするステップを含みます。 このマナーの中でテストされる項目は、実際にDesc内に存在する必要はありません。 もし、項目がない場合には、その値は、falseであるものとして考慮されます。 O の[[DefineOwnProperty]]内部メソッドが、プロパティ名 P 、プロパティ記述子 Desc、Booleanフラグ Throwとして呼ばれる場合、次のような段階を踏みます。
1.current は、プロパティ名 Pである O の[[GetOwnProperty]]内部メソッドを呼び、それを結果とする 2.extensible は、O の[[Extensible]]内部プロパティの値とする 3.current がundefinedで且つ、extensibleがfalseである場合、Reject 4.current がundefinedで且つ、extensibleがtrueである場合、 a.IsGenericDescriptor(Desc) や IsDataDescriptor(Desc) が trueである場合、 i. Desc によって説明される[[Value]]、[[Writable]]、[[Enumerable]]、[[Configurable]]属性値を持つオブジェクト O の P というデータプロパティ自身を生成。もし、Descの属性項目の値が存在しない場合には、新たに生成したプロパティの属性がデフォルト(既定)値としてセットされる b.それ以外の場合、Descは、accessor Property Descriptor(アクセサプロパティ記述子)にしなければいけないので i. Desc によって説明される[[Get]], [[Set]], [[Enumerable]] and [[Configurable]]属性値を持つオブジェクト O という P というアクセサプロパティ自身を生成。もし、Descの属性項目の値が存在しない場合には、新たに生成したプロパティの属性が、そのデフォルト(既定)値としてセットされる c.trueを返す 5.Desc内の全ての項目がカラである場合、trueを返す 6.Descにある全ての項目が、SameValue アルゴリズム (9.12)を使って比較した場合にcurrentに現れたり、currentにある項目とDescにある各項目の値が一致した同じ値である場合には、trueを返す 7.currentの[[Configurable]]項目がfalseである場合、 a.Descの[[Configurable]]項目がtrueである場合、Reject b.Descの[[Enumerable]]項目が存在し、currentの[[Enumerable]]項目とDescが相互に否定するBoolean型である場合、Reject 8.IsGenericDescriptor(Desc) が trueである場合、それ以上の妥当性検証は要求されることはない 9.それ以外の場合、IsDataDescriptor(current) と IsDataDescriptor(Desc)が異なる結果を持つ場合、 a.currentの[[Configurable]]項目がfalseである場合、Reject b.IsDataDescriptor(current) が trueである場合、 i.データプロパティからアクセサプロパティにオブジェクト O の P というプロパティを変換。変換したプロパティの[[Configurable]] と [[Enumerable]]属性に存在する値を保存し、残りのプロパティの属性には、それらの既定値を設定 c.それ以外の場合、 i.アクセサプロパティからデータプロパティにオブジェクト O の P というプロパティを変換。変換したプロパティの[[Configurable]] と [[Enumerable]]属性に存在する値を保存し、残りのプロパティの属性には、それらの既定値を設定 10.それ以外の場合でIsDataDescriptor(current) と IsDataDescriptor(Desc) が共に trueである場合、 a.currentの[[Configurable]]項目がfalseである場合、 i.currentの[[Writable]]項目がfalseで且つ、Descの[[Writable]]項目がtrueである場合、Reject ii.currentの[[Writable]]項目がfalseである場合、 1.Descの[[Value]]項目がpresentで且つ、SameValue(Desc.[[Value]], current.[[Value]]) が falseである場合、Reject b.それ以外の場合、currentの[[Configurable]]項目がtrueになるので一部変更が可能となる 11.それ以外の場合、IsAccessorDescriptor(current) と IsAccessorDescriptor(Desc) が共に true となるので a.currentの[[Configurable]]項目がfalseである場合、 i.Descの[[Set]]項目が存在し、SameValue(Desc.[[Set]]、current.[[Set]]) が falseである場合、Reject ii.Desc が presentである[[Get]]項目とSameValue(Desc.[[Get]]、 current.[[Get]])がfalseである場合、Reject 12.Desc が presentである各属性項目について、それに応じた項目の値にオブジェクト O の P というプロパティの名前付き属性を設定 13.trueを返す
しかしながら、もし、 O がArrayオブジェクトである場合には、15.4.5.1 で定義した、より精巧な[[DefineOwnProperty]]内部メソッドを持ちます。 [注釈] ステップ(段階) 10.b は、currentの[[Configurable]]項目がtrueである場合、currentの一致する項目とは異なるものである一部のDescの項目を許容します。 これは、[[Writable]]属性がfalseであるプロパティの[[Value]]の変更さえも可能にします。 これは、trueである[[Configurable]]属性が、[[Writable]]が、初めにtrueに設定され、新たに[[Value]]が設定される際に[[Writable]]がfalseに設定される場合に呼んだシーケンスと同等であることを許可する為、許容されます。