function shouldBe(actual, expected) { if (actual !== expected) throw new Error('bad value: ' + actual); } function test(object) { return "hello" in object; } noInline(test); var count = 0; var target = null; var key = null; var handler = { has(targetArg, keyArg) { ++count; target = targetArg; key = keyArg; return keyArg in targetArg; } }; var targetObject = {}; var proxy = new Proxy(targetObject, handler); for (var i = 0; i < 1e4; ++i) { shouldBe(count, i); shouldBe(test(proxy), false); shouldBe(target, targetObject); shouldBe(key, "hello"); } targetObject.hello = 42; for (var i = 0; i < 1e4; ++i) { shouldBe(count, i + 1e4); shouldBe(test(proxy), true); shouldBe(target, targetObject); shouldBe(key, "hello"); } delete targetObject.hello; for (var i = 0; i < 1e4; ++i) { shouldBe(count, i + 2e4); shouldBe(test(proxy), false); shouldBe(target, targetObject); shouldBe(key, "hello"); }