creates-a-data-descriptor.js (2692B)
1 // Copyright (C) 2015 the V8 project authors. All rights reserved. 2 // This code is governed by the BSD license found in the LICENSE file. 3 /*--- 4 es6id: 26.1.13 5 description: > 6 Creates a property data descriptor. 7 info: | 8 26.1.13 Reflect.set ( target, propertyKey, V [ , receiver ] ) 9 10 ... 11 4. If receiver is not present, then 12 a. Let receiver be target. 13 5. Return target.[[Set]](key, V, receiver). 14 15 9.1.9 [[Set]] ( P, V, Receiver) 16 17 ... 18 4. If ownDesc is undefined, then 19 a. Let parent be O.[[GetPrototypeOf]](). 20 b. ReturnIfAbrupt(parent). 21 c. If parent is not null, then 22 i. Return parent.[[Set]](P, V, Receiver). 23 d. Else, 24 ii. Let ownDesc be the PropertyDescriptor{[[Value]]: undefined, 25 [[Writable]]: true, [[Enumerable]]: true, [[Configurable]]: true}. 26 5. If IsDataDescriptor(ownDesc) is true, then 27 a. If ownDesc.[[Writable]] is false, return false. 28 b. If Type(Receiver) is not Object, return false. 29 c. Let existingDescriptor be Receiver.[[GetOwnProperty]](P). 30 d. ReturnIfAbrupt(existingDescriptor). 31 e. If existingDescriptor is not undefined, then 32 i. If IsAccessorDescriptor(existingDescriptor) is true, return false. 33 ii. If existingDescriptor.[[Writable]] is false, return false. 34 iii. Let valueDesc be the PropertyDescriptor{[[Value]]: V}. 35 iv. Return Receiver.[[DefineOwnProperty]](P, valueDesc). 36 f. Else Receiver does not currently have a property P, 37 i. Return CreateDataProperty(Receiver, P, V). 38 6. Assert: IsAccessorDescriptor(ownDesc) is true. 39 7. Let setter be ownDesc.[[Set]]. 40 8. If setter is undefined, return false. 41 ... 42 11. Return true. 43 includes: [propertyHelper.js] 44 features: [Reflect, Reflect.set] 45 ---*/ 46 47 var o1 = {}; 48 var result = Reflect.set(o1, 'p', 42); 49 assert.sameValue(result, true, 'returns true on a successful setting'); 50 var desc = Object.getOwnPropertyDescriptor(o1, 'p'); 51 assert.sameValue( 52 desc.value, 42, 53 'sets a data descriptor to set a new property' 54 ); 55 verifyProperty(o1, 'p', { 56 writable: true, 57 enumerable: true, 58 configurable: true, 59 }); 60 61 var o2 = {}; 62 var receiver = {}; 63 result = Reflect.set(o2, 'p', 43, receiver); 64 assert.sameValue( 65 result, true, 66 'returns true on a successful setting with a receiver' 67 ); 68 desc = Object.getOwnPropertyDescriptor(o2, 'p'); 69 assert.sameValue( 70 desc, undefined, 71 'does not set a data descriptor on target if receiver is given' 72 ); 73 desc = Object.getOwnPropertyDescriptor(receiver, 'p'); 74 assert.sameValue( 75 desc.value, 43, 76 'sets a data descriptor on the receiver object to set a new property' 77 ); 78 verifyProperty(receiver, 'p', { 79 writable: true, 80 enumerable: true, 81 configurable: true, 82 }); 83 84 reportCompare(0, 0);