[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);

 

posted @ 2020-08-27 02:50  Zhentiw  阅读(139)  评论(0编辑  收藏  举报