自定义 window 对象 属性 参考原始

Custom window object property with reference to original

我正在尝试在 Chrome 中开发一个扩展,它允许我拦截对 window 对象的访问。比方说我想 return 加倍 window.innerHeight,我试过如下设置:

Object.defineProperty(window, 'innerHeight', {
  get : () => window.innerHeight * 2,
});

但这显然会导致无限递归。如何在保持对原始 属性 的引用的同时重新定义 window 属性?执行 let windowOld = Object.assign({}, window); 之类的操作只会在该静态时刻捕获 window 属性,而不会实际维护对原始属性的引用。

通常,在这种情况下,您只需先将现有的 属性 保存在一个变量中 - 但复杂的是 window.innerHeight 是 getter/setter,而不是标准的 属性。因此,保存现有的 getter/setter,然后再次定义 属性(再次定义为 getter/setter,以保持一致性)。

const { get, set } = Object.getOwnPropertyDescriptor(window, 'innerHeight');
Object.defineProperty(
  window,
  'innerHeight',
  {
    get: () => get.call(window) * 2,
    set: (newVal) => set.call(window, newVal),
  }
);