【问题标题】:Is there a way to set an event on all class/object functions where a listener will receive function name and parameters?有没有办法在侦听器将接收函数名称和参数的所有类/对象函数上设置事件?
【发布时间】:2018-11-20 01:09:56
【问题描述】:

有没有办法在所有类/对象函数上设置事件,侦听器将接收函数名称和参数?

我希望能够在任何时候调用作为常规对象或类的一部分的函数来运行某些功能。

这样做的目的是为函数分配对象级缓存,我可能会走上一条复杂的道路。假设我有一个调用 nodejs sequelize 方法的服务函数,例如,我想将它缓存 x 分钟。因此,上面的侦听器将使用 ttl 写入 redis,并在调用该函数时检查 redis。

我使用 Scala 进行此操作,没有样板代码,使用注释来表示任何方法的 ttl 和用于该无聊集合的宏并进入 redis。不知道如何使用 Javascript / nodejs 来完成。

如果这是一个不恰当的堆栈溢出问题,请提前道歉,但任何一般性的指导都会有所帮助。

【问题讨论】:

标签: javascript node.js event-handling dom-events


【解决方案1】:

使用 JavaScript 执行此操作的现代方法是通过代理对象。以下是文档中对它们的描述:

Proxy 对象用于为基础定义自定义行为 操作例如属性查找、赋值、枚举、函数 调用等)。

这里:

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Proxy

【讨论】:

    【解决方案2】:

    你基本上是在寻找一个装饰器(目前是Stage 2 Draft,所以还不是语言的一部分)。

    但是 - 使用代理你可以创建类似的东西:

    class MyClass {
      func1() {
        console.log('run func1');
      }
      func2() {
        console.log('run func2');
      }
    }
    
    m = new MyClass();
    
    var p = new Proxy(m, {
        get: function(target, name, receiver) {
          if (typeof target[name] == 'function') {
            console.log('wrapper on', name);
            return target[name]
          }
        }
    });
    
    p.func1();
    p.func2();

    【讨论】:

      猜你喜欢
      • 2011-07-14
      • 2011-11-22
      • 2013-03-01
      • 1970-01-01
      • 2021-01-12
      • 2020-05-12
      • 2021-02-17
      • 1970-01-01
      相关资源
      最近更新 更多