[Javascript] Wrap a Javascript Built-in constructor with Proxy
Instances of most built-in constructors also use a mechanism that is not intercepted by Proxies. They therefore can’t be wrapped transparently, either. We can see that if we use an instance of Date
:
const proxy = new Proxy(new Date(), {}); assert.throws( () => proxy.getFullYear(), /^TypeError: this is not a Date object\.$/ );
The mechanism that is unaffected by Proxies is called internal slots. These slots are property-like storage associated with instances. The specification handles these slots as if they were properties with names in square brackets.
As a work-around, we can change how the handler forwards method calls and selectively set this
to the target and not the Proxy:
const handler = { get(target, propKey, receiver) { if (propKey === 'getFullYear') { return target.getFullYear.bind(target); } return Reflect.get(target, propKey, receiver); }, }; const proxy = new Proxy(new Date('2030-12-24'), handler); assert.equal(proxy.getFullYear(), 2030);