function assert(b) { if (!b) throw new Error("Bad assertion!"); } { let p = {}; let target = {__proto__: p}; let called = false; let handler = { get(target, key, receiver) { called = true; assert(key === "__proto__"); return target[key]; }, getPrototypeOf() { assert(false); } }; let proxy = new Proxy(target, handler); for (let i = 0; i < 500; i++) { assert(proxy.__proto__ === p); assert(called); called = false; } } { let p = {}; let target = {__proto__: p}; let called1 = false; let called2 = false; let handler = { get(target, key, receiver) { called1 = true; assert(key === "__proto__"); return Reflect.get(target, key, receiver); }, getPrototypeOf(...args) { called2 = true; return Reflect.getPrototypeOf(...args); } }; let proxy = new Proxy(target, handler); for (let i = 0; i < 500; i++) { assert(proxy.__proto__ === p); assert(called1); assert(called2); called1 = false; called2 = false; } } { let p = {}; let target = {__proto__: null}; let called = false; let handler = { set(target, key, value, receiver) { called = true; assert(key === "__proto__"); return target[key] = value; }, setPrototypeOf() { assert(false); } }; let proxy = new Proxy(target, handler); for (let i = 0; i < 500; i++) { proxy.__proto__ = p; assert(proxy.__proto__ === p); assert(target.__proto__ === p); target.__proto__ = null; assert(called); called = false; } } { let p = {}; let target = {__proto__: null}; let called = false; let handler = { set(target, key, value, receiver) { called = true; assert(key === "__proto__"); return Reflect.set(target, key, value, receiver); }, setPrototypeOf() { assert(false); } }; let proxy = new Proxy(target, handler); for (let i = 0; i < 500; i++) { proxy.__proto__ = p; assert(proxy.__proto__ === p); assert(target.__proto__ === p); target.__proto__ = null; assert(called); called = false; } }