| // obj.hasOwnProperty(id), Object.getOwnPropertyDescriptor(obj, id), and |
| // Object.defineProperty(obj, id, desc) do not look at obj's prototype. |
| |
| var angryHandler = new Proxy({}, { |
| has: () => true, |
| get: (t, id) => { |
| throw new Error("angryHandler should not be queried (" + id + ")"); |
| } |
| }); |
| var angryProto = new Proxy({}, angryHandler); |
| |
| var obj = Object.create(angryProto, { |
| // Define hasOwnProperty directly on obj since we are poisoning its |
| // prototype chain. |
| hasOwnProperty: { |
| value: Object.prototype.hasOwnProperty |
| } |
| }); |
| |
| assertEq(Object.getOwnPropertyDescriptor(obj, "foo"), undefined); |
| assertEq(obj.hasOwnProperty("foo"), false); |
| Object.defineProperty(obj, "foo", {value: 5}); |
| assertEq(obj.hasOwnProperty("foo"), true); |
| assertEq(obj.foo, 5); |