javascript - 在对象属性访问/读取上添加事件监听器

标签 javascript

有没有办法为全局对象属性的访问添加事件监听器?不是在调用函数时,而是在实际读取属性时。

举个例子,假设我想监控对window.screen 的所有访问。

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

最佳答案

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

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

const { get: origGet, set: origSet } = Object.getOwnPropertyDescriptor(window, 'screen');
Object.defineProperty(window, 'screen', {
  get() {
    console.log('Running custom code for window.screen getter!');
    return origGet.call(window);
  },
  set(param) {
    console.log('Running custom code for window.screen setter!');
    return origSet.call(window, param);
  }
});

console.log(window.screen);

(在这种特殊情况下,内置的 setter 似乎实际上没有做任何事情)

关于javascript - 在对象属性访问/读取上添加事件监听器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59205330/

相关文章:

javascript - 使用ajax滚动溢出的div

javascript - JavaScript 中的表单验证。我想验证一个字段,以便它只接受 "KK-10-HUH"形式的汽车注册

javascript - angularJS窗口调整大小问题

javascript - AngularJS 中的二维数组 $Index

javascript - 使用 jquery 识别按钮的高度会给出错误的结果

javascript - 如何在页面加载时设置 jquery 切换关闭?

javascript - 为了使我的代码正常工作,我必须更改 Cheerio 的一些核心功能,如何将其保留在我的模块中?

javascript - JQuery找到距离当前时间最近的元素值然后添加类

javascript - setInterval 在 Firefox 中无法正常工作

javascript - orderByChild 在 Firebase 中不起作用