9.1.9.1 OrdinarySet ( O, P, V, Receiver )
当使用对象 O、属性关键字 P、值 V 和 ECMAScript 语言值 Receiver 来调用抽象操作 OrdinarySet 时,采取以下步骤:
断言:IsPropertyKey(P) 为 true。
使 ownDesc 变为 ? O.[[GetOwnProperty]](P)。
如果 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。