9.1.9.1 OrdinarySet ( O, P, V, Receiver )

当使用对象 O、属性关键字 P、值 V 和 ECMAScript 语言值 Receiver 来调用抽象操作 OrdinarySet 时,采取以下步骤:

  1. 断言:IsPropertyKey(P) 为 true

  2. 使 ownDesc 变为 ? O.[[GetOwnProperty]](P)。

  3. 如果 ownDesc undefined,那么

a. 使 parent 变为 ? O.[[GetPrototypeOf]]()。

b. 如果 parent 不为 null,那么

i. 返回 ? parent.[[Set]](P, V, Receiver)。

c. 否则,

i. 使 ownDesc 变为 PropertyDescriptor{[[Value]]: undefined, [[Writable]]: true, [[Enumerable]]: true, [[Configurable]]: true}。

4.如果 IsDataDescriptor(ownDesc) 为 true,那么

a. 如果 ownDesc.[[Writable]] 为 false,则返回 false

b. 如果 Type(Receiver) 不是 Object 类型,则返回 false

c. 使 existingDescriptor 变为 ? Receiver.[[GetOwnProperty]](P)。

d. 如果 existingDescriptor 不为 undefined,那么

i. 如果 IsAccessorDescriptor(existingDescriptor) 为 true,返回 false

ii. 如果 existingDescriptor.[[Writable]] 为 false,则返回 false

iii. 使 valueDesc 变为 PropertyDescriptor{[[Value]]: V}。

iv. 返回 ? Receiver.[[DefineOwnProperty]](P, valueDesc)。

e. 否则 Receiver 当前不具有属性 P,那么

i. 返回 ? CreateDataProperty(Receiver, P, V)。

5.断言: IsAccessorDescriptor(ownDesc) 为 true。

6.使 setter 变为 ownDesc.[[Set]]。

7.如果 setter undefined,则返回 false

8.执行 ? Call(setter, Receiver, « V »)。

9.返回 true

results matching ""

    No results matching ""