9.1.6.3 ValidateAndApplyPropertyDescriptor ( O, P, extensible, Desc, current )

当使用对象 O,属性键 P,布尔值 extensible 和属性描述符 Desc 和当前时调用抽象操作 ValidateAndApplyPropertyDescriptor 时,采取以下步骤:

注意:如果 undefined 作为O参数传递,则仅执行验证,并且不执行对象更新。

  1. 断言:如果 O 不为 undefined,那么 IsPropertyKey(P) 为 true
  2. 如果 current undefined,那么

a. 如果 extensible false,则返回 false。 b.断言:extensible true

c. 如果 IsGenericDescriptor(Desc) 为 trueIsDataDescriptor(Desc) 为 true,那么

i. 如果 O undefined,则创建自己的对象 O 的名为 P 的数据属性,其 [[Value]]、[[Writable]]、[[Enumerable]] 和 [[Configurable]] 属性值由Desc 描述。 如果 Desc 的属性字段的值不存在,则将新创建的属性的属性设置为其默认值。

d. 否则 Desc 必须作为一个存取器属性描述符,

i. 如果 O undefined,则创建自己的访问器属性 P 的对象 O,其 [[Get]]、[[Set]]、[[Enumerable]] 和 [[Configurable]] 属性值由 Desc 描述。 如果 Desc 的属性字段的值不存在,则将新创建的属性的属性设置为其默认值。

e. 返回 true

3.如果 Desc 中的每个字段都不存在,则返回 true

4.如果当前的 [[Configurable]] 字段为 false,则

a. 如果 Desc 的 [[Configurable]] 字段存在且其值为 true,则返回 false

b. 如果 Desc 的 [[Enumerable]] 字段存在并且当前和 Desc 的 [[Enumerable]] 字段是彼此的 Boolean 否定,则返回 false

5.如果 IsGenericDescriptor(Desc) 为 true,则不需要进一步验证。

6.Else if IsDataDescriptor(current) 和 IsDataDescriptor(Desc) 有不同的结果,那么

a. 如果当前的 [[Configurable]] 字段为false,则返回 false

b. 如果 IsDataDescriptor(current) 为 true,那么

i.如果 O 为 undefined,请将对象 O 的名为 P 的属性从数据属性转换为访问器属性。 保留转换属性的 [[Configurable]] 和 [[Enumerable]] 属性的现有值,并将属性的其余属性设置为其默认值。

c. 否则,

i. 如果 O 为 undefined,请将对象 O 的名为 P 的属性从访问器属性转换为数据属性。 保留转换属性的 [[Configurable]] 和 [[Enumerable]] 属性的现有值,并将属性的其余属性设置为其默认值。

7.否则如果 IsDataDescriptor(current) 和 IsDataDescriptor(Desc) 都为 true,那么

a. 如果当前的 [[Configurable]] 字段为 false,则

i. 果当前的 [[Writable]] 字段为 false,则

1.如果 Desc 的 [[Writable]] 字段存在并且 Desc 的 [[Writable]] 字段为 true,则返回 false

2.如果 Desc 的 [[Value]] 字段存在,并且 SameValue(Desc.[[Value]],current.[[Value]])为 false,则返回 false

3.返回 true

8.否则 IsAccessorDescriptor(current) 和 IsAccessorDescriptor(Desc) 都为 true,那么

a. 如果当前的 [[Configurable]] 字段为 false,则

i. 如果 Desc 的 [[Set]] 字段存在,并且 SameValue(Desc.[[Set]], current.[[Set]]) 为 false,则返回 false

ii. 返回 false,如果 Desc 的 [[Get]] 字段存在,并且 SameValue(Desc.[[Get]], current.[[Get]]) 为 false

iii. 返回 true

9.如果 O 不为 undefined,那么

a. 对于存在的每个 Desc 的字段,将对象 O 的名为 P 的属性的对应属性设置为字段的值。

10.返回 true

results matching ""

    No results matching ""