trap-is-undefined-target-is-proxy.js (1288B)
1 // Copyright (C) 2020 Alexey Shvayka. All rights reserved. 2 // This code is governed by the BSD license found in the LICENSE file. 3 4 /*--- 5 esid: sec-proxy-object-internal-methods-and-internal-slots-delete-p 6 description: > 7 If "deleteProperty" trap is null or undefined, [[Delete]] call is 8 properly forwarded to [[ProxyTarget]] (which is also a Proxy object). 9 info: | 10 [[Delete]] ( P ) 11 12 [...] 13 5. Let target be O.[[ProxyTarget]]. 14 6. Let trap be ? GetMethod(handler, "deleteProperty"). 15 7. If trap is undefined, then 16 a. Return ? target.[[Delete]](P). 17 features: [Proxy, Reflect] 18 ---*/ 19 20 var array = [1]; 21 var arrayTarget = new Proxy(array, {}); 22 var arrayProxy = new Proxy(arrayTarget, { 23 deleteProperty: undefined, 24 }); 25 26 assert(delete arrayProxy[0]); 27 assert(!array.hasOwnProperty("0")); 28 29 assert(!Reflect.deleteProperty(arrayProxy, "length")); 30 assert.sameValue(array.length, 1); 31 32 33 var trapCalls = 0; 34 var target = new Proxy({}, { 35 deleteProperty: function(_target, key) { 36 trapCalls++; 37 return key === "foo"; 38 }, 39 }); 40 41 var proxy = new Proxy(target, { 42 deleteProperty: undefined, 43 }); 44 45 assert(delete proxy.foo); 46 assert.sameValue(trapCalls, 1); 47 48 assert.throws(TypeError, function() { 49 "use strict"; 50 delete proxy.bar; 51 }); 52 assert.sameValue(trapCalls, 2); 53 54 reportCompare(0, 0);