/* Any copyright is dedicated to the Public Domain. * http://creativecommons.org/publicdomain/zero/1.0/ */ function logProxy(object) { var log = []; var handler = { getOwnPropertyDescriptor(target, propertyKey) { log.push(propertyKey); return Object.getOwnPropertyDescriptor(target, propertyKey); } }; var proxy = new Proxy(object, new Proxy(handler, { get(target, propertyKey, receiver) { if (!(propertyKey in target)) { throw new Error(`Unexpected call to trap: "${propertyKey}"`); } return target[propertyKey]; } })); return {proxy, log}; } var properties = ["string-property"]; if (typeof Symbol === 'function') properties.push(Symbol("symbol-property")); for (var property of properties) { // Test 1: property is not present on object var {proxy, log} = logProxy({}); var result = Object.prototype.propertyIsEnumerable.call(proxy, property); assertEq(result, false); assertDeepEq(log, [property]); // Test 2: property is present on object and enumerable var {proxy, log} = logProxy({[property]: 0}); var result = Object.prototype.propertyIsEnumerable.call(proxy, property); assertEq(result, true); assertDeepEq(log, [property]); // Test 3: property is present on object, but not enumerable var {proxy, log} = logProxy(Object.defineProperty({[property]: 0}, property, {enumerable: false})); var result = Object.prototype.propertyIsEnumerable.call(proxy, property); assertEq(result, false); assertDeepEq(log, [property]); // Test 4: property is present on prototype object var {proxy, log} = logProxy(Object.create({[property]: 0})); var result = Object.prototype.propertyIsEnumerable.call(proxy, property); assertEq(result, false); assertDeepEq(log, [property]); // Test 5: property is present on prototype object, prototype is proxy object var {proxy, log} = logProxy({[property]: 0}); var result = Object.prototype.propertyIsEnumerable.call(Object.create(proxy), property); assertEq(result, false); assertDeepEq(log, []); } reportCompare(0, 0);