代理 window 对象以检测变化
Proxying window object to detect changes
我可以代理 window
对象来检测变化吗?我尝试了以下但没有任何运气:
var handler = {
get: function(target, property) {
console.log("getting " + property + " for " + target);
return target[property];
},
set: function(target, property, value, receiver) {
console.log("setting " + property + " for " + target + " with value " + value);
target[property] = value;
return true;
},
};
var p = new Proxy(window, handler);
setTimeout(() => {
window.a = 10; // expecting a log, but nothing...
}, 3000);
setTimeout(() => {
window.c = 20; // expecting a log, but nothing...
}, 4000);
您必须在较低的代码中引用 Proxy 实例,而不是 window
:
var handler = {
get: function(target, property) {
console.log("getting " + property + " for " + target);
return target[property];
},
set: function(target, property, value, receiver) {
console.log("setting " + property + " for " + target + " with value " + value);
target[property] = value;
return true;
},
};
var p = new Proxy(window, handler);
setTimeout(() => {
p.a = 10; // <------------
}, 300);
setTimeout(() => {
p.c = 20; // <------------
}, 400);
如果您不能更改引用 window
的代码,您也可以将代理命名为 window
(并在另一个变量中保存对真实 window 的引用) ,但其代码看起来会令人困惑。
如果它在独立的脚本文件中,上述技巧将不起作用,您将无法使用 Proxy
- 您无法重新定义 window 对象,毕竟。如果您正在寻找 window
上特定 属性 的更改,您可以使用 defineProperty
并让 setter 用新的 属性 描述符覆盖分配给时的值:
Object.defineProperty(window, 'a', {
configurable: true,
set(value) {
console.log("setting with value " + value);
Object.defineProperty(window, 'a', { value });
}
});
setTimeout(() => {
window.a = 10;
console.log(window.a);
}, 300);
我可以代理 window
对象来检测变化吗?我尝试了以下但没有任何运气:
var handler = {
get: function(target, property) {
console.log("getting " + property + " for " + target);
return target[property];
},
set: function(target, property, value, receiver) {
console.log("setting " + property + " for " + target + " with value " + value);
target[property] = value;
return true;
},
};
var p = new Proxy(window, handler);
setTimeout(() => {
window.a = 10; // expecting a log, but nothing...
}, 3000);
setTimeout(() => {
window.c = 20; // expecting a log, but nothing...
}, 4000);
您必须在较低的代码中引用 Proxy 实例,而不是 window
:
var handler = {
get: function(target, property) {
console.log("getting " + property + " for " + target);
return target[property];
},
set: function(target, property, value, receiver) {
console.log("setting " + property + " for " + target + " with value " + value);
target[property] = value;
return true;
},
};
var p = new Proxy(window, handler);
setTimeout(() => {
p.a = 10; // <------------
}, 300);
setTimeout(() => {
p.c = 20; // <------------
}, 400);
如果您不能更改引用 window
的代码,您也可以将代理命名为 window
(并在另一个变量中保存对真实 window 的引用) ,但其代码看起来会令人困惑。
如果它在独立的脚本文件中,上述技巧将不起作用,您将无法使用 Proxy
- 您无法重新定义 window 对象,毕竟。如果您正在寻找 window
上特定 属性 的更改,您可以使用 defineProperty
并让 setter 用新的 属性 描述符覆盖分配给时的值:
Object.defineProperty(window, 'a', {
configurable: true,
set(value) {
console.log("setting with value " + value);
Object.defineProperty(window, 'a', { value });
}
});
setTimeout(() => {
window.a = 10;
console.log(window.a);
}, 300);