different-property-descriptors.js (2126B)
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 Return false if target property turns to a data descriptor and receiver 7 property is an accessor descriptor. 8 info: | 9 26.1.13 Reflect.set ( target, propertyKey, V [ , receiver ] ) 10 11 ... 12 4. If receiver is not present, then 13 a. Let receiver be target. 14 5. Return target.[[Set]](key, V, receiver). 15 16 9.1.9 [[Set]] ( P, V, Receiver) 17 18 ... 19 4. If ownDesc is undefined, then 20 a. Let parent be O.[[GetPrototypeOf]](). 21 b. ReturnIfAbrupt(parent). 22 c. If parent is not null, then 23 i. Return parent.[[Set]](P, V, Receiver). 24 d. Else, 25 ii. Let ownDesc be the PropertyDescriptor{[[Value]]: undefined, 26 [[Writable]]: true, [[Enumerable]]: true, [[Configurable]]: true}. 27 5. If IsDataDescriptor(ownDesc) is true, then 28 a. If ownDesc.[[Writable]] is false, return false. 29 b. If Type(Receiver) is not Object, return false. 30 c. Let existingDescriptor be Receiver.[[GetOwnProperty]](P). 31 d. ReturnIfAbrupt(existingDescriptor). 32 e. If existingDescriptor is not undefined, then 33 i. If IsAccessorDescriptor(existingDescriptor) is true, return false. 34 ... 35 features: [Reflect, Reflect.set] 36 ---*/ 37 38 var receiver = {}; 39 var fn = function() {}; 40 Object.defineProperty(receiver, 'p', { 41 set: fn 42 }); 43 44 var o1 = {}; 45 var result = Reflect.set(o1, 'p', 42, receiver); 46 assert.sameValue( 47 result, false, 48 'target has no own `p` and receiver.p has an accessor descriptor' 49 ); 50 assert.sameValue( 51 Object.getOwnPropertyDescriptor(receiver, 'p').set, fn, 52 'receiver.p is not changed' 53 ); 54 assert.sameValue(o1.hasOwnProperty('p'), false, 'target.p is not set'); 55 56 var o2 = { 57 p: 43 58 }; 59 result = Reflect.set(o2, 'p', 42, receiver); 60 assert.sameValue( 61 result, false, 62 'target.p has a data descriptor and receiver.p has an accessor descriptor' 63 ); 64 assert.sameValue( 65 Object.getOwnPropertyDescriptor(receiver, 'p').set, fn, 66 'receiver.p is not changed' 67 ); 68 assert.sameValue(o2.p, 43, 'target.p is not changed'); 69 70 reportCompare(0, 0);