function assert(b) { if (!b) throw new Error("Bad assertion"); } let theTarget = {}; Object.defineProperty(theTarget, "x", { writable: false, configurable: false, value: 45 }); Object.defineProperty(theTarget, "y", { writable: false, configurable: false, value: 45 }); Object.defineProperty(theTarget, "getter", { configurable: false, set: function(x) { } }); Object.defineProperty(theTarget, "badGetter", { configurable: false, set: function(x) { } }); let handler = { get: function(target, propName, proxyArg) { assert(target === theTarget); assert(proxyArg === proxy); if (propName === "x") return 45; else if (propName === "y") return 30; else if (propName === "getter") return undefined; else { assert(propName === "badGetter"); return 25; } } }; let proxy = new Proxy(theTarget, handler); for (let i = 0; i < 1000; i++) { assert(proxy.x === 45); assert(proxy["x"] === 45); } for (let i = 0; i < 1000; i++) { try { if (i % 2) proxy.y; else proxy["y"]; } catch(e) { threw = true; assert(e.toString() === "TypeError: Proxy handler's 'get' result of a non-configurable and non-writable property should be the same value as the target's property"); } assert(threw === true); } for (let i = 0; i < 1000; i++) { assert(proxy.getter === undefined); assert(proxy["getter"] === undefined); } for (let i = 0; i < 1000; i++) { try { if (i % 2) proxy.badGetter; else proxy["badGetter"]; } catch(e) { threw = true; assert(e.toString() === "TypeError: Proxy handler's 'get' result of a non-configurable accessor property without a getter should be undefined"); } assert(threw === true); }