首页 > 解决方案 > Reflect.get() 使用代理 = 错误非法调用

问题描述

我正在尝试使用 Chromium 通过点访问器记录插入到 localStorage 的项目。

但是我在使用 Reflect.get() 方法时遇到了这个错误。

Uncaught TypeError: Illegal invocation

这是我的脚本

const localStorageProxy = new Proxy(localStorage, {
    get(target, name, receiver) {
      // error here
      const value = Reflect.get(target, name, receiver);

      if (!['setItem', 'getItem', 'removeItem'].includes(name)) {
        console.log(value);
        console.trace();
      }
      return typeof value === 'function' ?
          value.bind(target) :
          value;
    },
    set(target, name, value, receiver) {
      if (!['setItem', 'getItem', 'removeItem'].includes(name)) {
       console.log(value);
       console.trace();
      }
      if (name === 'setItem') {
        return false;
      }
      // probably an error here too
      return Reflect.set(target, name, value, receiver);
    },
  });

  Object.defineProperty(window, 'localStorage', {
    value: localStorageProxy,
    configurable: true,
    enumerable: true,
    writable: false,
  });

预期结果:window.localStorage.myItem = 'some-value' 应该记录值和堆栈跟踪

此脚本在 Chromium v​​74 上与 Tampermonkey 一起使用(应该没问题,受 Chrome 49 及更高版本支持)。

我该如何解决这个问题?

标签: javascriptchromium

解决方案


推荐阅读