- 如果 Type(V) 不是引用,拋出一個(gè) ReferenceError 異常。
- 令 base 為調(diào)用 GetBase(V) 的結(jié)果。
- 如果 IsUnresolvableReference(V),那么如果 IsStrictReference(V) 是 true,那么拋出 ReferenceError 異常。用 GetReferencedName(V),W,false 作為參數(shù)調(diào)用全局對象的 [[Put]] 內(nèi)部方法。
- 否則如果 IsPropertyReference(V),那么如果 HasPrimitiveBase(V) 是 false,那么令 put 為 base 的 [[Put]] 內(nèi)部方法,否則令 put 為下面定義的特殊的 [[Put]] 內(nèi)部方法。用 base 作為 this 值,用 GetReferencedName(V),W,IsStrictReference(V) 作為參數(shù)調(diào)用 put 內(nèi)部方法。
- 否則 base 必定是 environment record 作為 base 的引用。所以,用 GetReferencedName(V), W, IsStrictReference(V) 作為參數(shù)調(diào)用 base 的 SetMutableBinding (10.2.1) 具體方法。
- 返回。
PutValue 中的 V 是原始基值的屬性引用時(shí)使用下面的 [[Put]] 內(nèi)部方法。用 base 作為 this 值,用屬性 P,值 W,布爾標(biāo)志 Throw 作為參數(shù)調(diào)用它。采用以下步驟:
- 令 O 為 ToObject(base)。
- 如果用 P 作為參數(shù)調(diào)用 O 的 [[CanPut]] 內(nèi)部方法的結(jié)果是 false,那么如果 Throw 是 true,那么拋出一個(gè) TypeError 異常。否則返回。
- 令 ownDesc 為用 P 作為參數(shù)調(diào)用 O 的 [[GetOwnProperty]] 內(nèi)部方法的結(jié)果。
- 如果 IsDataDescriptor(ownDesc) 是 true,那么如果 Throw 是 true,那么拋出一個(gè) TypeError 異常。否則返回。
- 令 desc 為用 P 作為參數(shù)調(diào)用 O 的 [[GetProperty]] 內(nèi)部方法的結(jié)果。這可能是一個(gè)自身或繼承的訪問器屬性描述或是一個(gè)繼承的數(shù)據(jù)屬性描述。
- 如果 IsAccessorDescriptor(desc) 是 true,那么令 setter 為 desc.Set,他不能是 undefined。用 base 作為 this 值,用只由 W 組成的列表作為參數(shù)調(diào)用 setter 的 [[Call]] 內(nèi)部方法。
- 否則,這是要在臨時(shí)對象 O 上創(chuàng)建自身屬性的請求。如果 Throw 是 true,拋出一個(gè) TypeErroe 異常。
- 返回。
上述方法之外無法訪問在第一步創(chuàng)建的對象。實(shí)現(xiàn)可以選擇不真的創(chuàng)建這個(gè)臨時(shí)對象。使用這個(gè)內(nèi)部方法給實(shí)際屬性訪問產(chǎn)生可見影響的情況只有在調(diào)用訪問器函數(shù)時(shí),或 Throw 未通過提前錯(cuò)誤檢查。當(dāng) Throw 是 true,試圖在這個(gè)臨時(shí)對象上創(chuàng)建新屬性的任何屬性分配操作會拋出一個(gè)錯(cuò)誤。
更多建議: