javascript - 当任何其他类函数被调用时运行一个函数

标签 javascript ecmascript-6 ecmascript-5

我有一个包含 100 多个函数的 es6 类。
我添加了一个新函数,每次调用任何其他函数时我都必须运行它。
我找到了很多解决方案,但没有人解决我的问题...
我知道我可以将此调用添加到每个函数,但我将以重复代码和所有函数的大量工作结束。

那就是我到目前为止所做的:

return class Test {
    constructor () {}

    addedFN() {
         console.log('FN');
    }

    A() {
        this.addedFN();
        console.log('A');
    }

    B() {
        this.addedFN();
        console.log('B');
    }

    C() {
        this.addedFN();
        console.log('C');
    }
    ...
}

正如我们在这种方法中看到的那样,我有很多我想避免的代码重复...
另外,先调用新函数再在内部调用下一个函数的解决方案是行不通的,因为所有的函数都在应用程序的很多地方使用。

我还尝试在构造函数中运行以下代码,但这是一个糟糕的解决方案,因为我的类被调用了很多次,然后每次都会运行此代码:

for(const key of Object.getOwnPropertyNames(Test.prototype)) {
 const old = Test.prototype[key];
 Test.prototype[key] = function(...args) {
   addedFN(...args);
   old.call(this, ...args);
 };
}

最佳答案

不要在构造函数中运行它,在类声明之后运行它

此外,该解决方案将导致过多的递归,因为它也适用于 addedFn,后者将调用 addedFn,后者将调用 addedFn ... 等等,直到你的浏览器抛出“太多递归”错误

所以你也不想将它应用到 addedFn

在下面的代码中,我也没有将它应用于 constructor ... 但是,即使我这样做了,它也不会调用 addedFn 当对象构造函数,所以,为了更清楚,我明确地不触及构造函数

class Test {
  constructor(y) {
    this.y = y
  }
  fun1(x) {
    console.log('I am fun1', x, this.y);
  }
  fun2() {
    console.log('I am fun2');
  }
  addedFn(...x) {
    console.log('added function', ...x);
  }
}
Object.getOwnPropertyNames(Test.prototype).forEach(f => {
  if (f !== 'constructor' && f !== 'addedFn' && typeof Test.prototype[f] === 'function') {
    const old = Test.prototype[f];
    Test.prototype[f] = function(...args) {
      this.addedFn(...args);
      return old.apply(this, args);
    }
  }
})
let c = new Test('works');
c.fun1(1,2,3)

注意:你还应该测试 Test.prototype[f] 是否是一个函数——除非你的类只有函数

关于javascript - 当任何其他类函数被调用时运行一个函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68298411/

相关文章:

javascript - DataTables.Net - 有没有办法从数据中设置属性?

javascript - 如何从 moment.unix() 将 moment 解析为特定时区

javascript - 我无法让基本的 ES6 导入工作

javascript - 将对象内的多个数组合并为单个数组

javascript - Ecmascript 5.1 中哪里提到 if 语句中不接受左大括号?

javascript - 用动态数组填充 angularjs 作用域

javascript - 与 'undefined` 的比较是否仍然进行全局范围查找?

javascript - 下载 jQuery 移动项目中的文件

javascript - $.link jsrender 不起作用

javascript - 如何优化此计算器中的类型描述?