zl程序教程

您现在的位置是:首页 >  前端

当前栏目

[Javascript] Wrap a Javascript Built-in constructor with Proxy

JavaScript in with Proxy constructor wrap built
2023-09-14 09:00:47 时间

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