自定义 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),
}
);
我正在尝试在 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),
}
);