Javascript 在对象属性访问/读取上添加事件侦听器

Javascript 在对象属性访问/读取上添加事件侦听器,javascript,Javascript,是否有方法将事件侦听器添加到全局对象属性的访问中?不是在调用函数时,而是在实际读取属性时 例如,假设我想监视对window.screen的所有访问 我不想更改现有的行为-console.log(window.screen.availWidth)应该仍然有效。但是,我想在读取时调用另一个函数 这有点奇怪,但这是可能的-如果属性是可配置的,您可以将其更改为getter/setter,getter在其中调用您自己的函数,然后运行原始功能 window.screen已经是一个getter/setter,

是否有方法将事件侦听器添加到全局对象属性的访问中?不是在调用函数时,而是在实际读取属性时

例如,假设我想监视对
window.screen
的所有访问


我不想更改现有的行为-
console.log(window.screen.availWidth)
应该仍然有效。但是,我想在读取时调用另一个函数

这有点奇怪,但这是可能的-如果属性是可配置的,您可以将其更改为getter/setter,getter在其中调用您自己的函数,然后运行原始功能

window.screen
已经是一个getter/setter,因此首先保存对原始getter/setter函数的引用:

const{get:origGet,set:origSet}=Object.getOwnPropertyDescriptor(窗口,“屏幕”);
Object.defineProperty(窗口,“屏幕”{
得到(){
log('Running custom code for window.screen getter!');
返回原代码调用(窗口);
},
设置(参数){
log('Running custom code for window.screen setter!');
返回原始设置调用(窗口,参数);
}
});

控制台.日志(窗口.屏幕)这样做有点奇怪,但这是可能的-如果属性是可配置的,您可以将其更改为getter/setter,getter在其中调用您自己的函数,然后运行原始功能

window.screen
已经是一个getter/setter,因此首先保存对原始getter/setter函数的引用:

const{get:origGet,set:origSet}=Object.getOwnPropertyDescriptor(窗口,“屏幕”);
Object.defineProperty(窗口,“屏幕”{
得到(){
log('Running custom code for window.screen getter!');
返回原代码调用(窗口);
},
设置(参数){
log('Running custom code for window.screen setter!');
返回原始设置调用(窗口,参数);
}
});

控制台.日志(窗口.屏幕)
ES2015
代理
,它有着各种奇怪而奇妙的用途

考虑到你的问题:

我想监视对window.screen的所有访问

我不想改变现有的行为-
console.log(window.screen.availWidth)
仍然可以工作。不过,我还是会的 我想在读取时调用另一个函数

ES2015
Proxy
听起来像是完美的工具


工作示例:

let处理程序={
get:(obj)=>{
log(“我是代理”);
返回obj.availWidth;
}
}
window.screen=新代理(window.screen,处理程序);

console.log(window.screen.availWidth)
ES2015
代理
,它有着各种奇怪而奇妙的用途

考虑到你的问题:

我想监视对window.screen的所有访问

我不想改变现有的行为-
console.log(window.screen.availWidth)
仍然可以工作。不过,我还是会的 我想在读取时调用另一个函数

ES2015
Proxy
听起来像是完美的工具


工作示例:

let处理程序={
get:(obj)=>{
log(“我是代理”);
返回obj.availWidth;
}
}
window.screen=新代理(window.screen,处理程序);

console.log(window.screen.availWidth)这太棒了,谢谢!看起来正是我想要的。太好了,谢谢!看起来正是我想要的。