带有Object Literals的ES6代理拦截器自引用

时间:2017-12-22 15:04:56

标签: javascript node.js ecmascript-6 ecma

我有node.JS应用程序,它具有多次使用相同参数调用的方法。 (尝试组合的优化问题)

源代码非常庞大,我对它并不熟悉,我试图找到使用相同参数多次调用哪些方法,以便记住它们并提高算法的性能

因此,我尝试使用各自的参数拦截所有方法调用,将它们存储在 Set()中,并查看方法调用和唯一参数之间的区别。

我正在使用ES6代理对象,如下所示:

module.exports = function (app) {
    const fitness = {
        staticFunction: () => true,
        normalize: (a, b) => {
            return (fitness.staticFunction()) ? a+b : 0;
        }
    };
    return process.traceMethodCalls(fitness); // injected my proxy here
};

然后,我可以查看 log 变量,了解 log.calls log.params.size()之间的差异,以查看最佳候选人记忆。

这种技术效果很好,但显然不会拦截对象文字调用本身。 以下是(项目中的示例模块)

失败的示例
message_level

执行后,我的日志变量中有规范化功能,但 staticFunction 却没有,因为它不是<\ n>调用拦截的对象,但直接调用健身

拦截这些方法调用的最佳方法是什么?

1 个答案:

答案 0 :(得分:2)

您可以像这样注入代理:

let fitness = { … };
fitness = process.traceMethodCalls(fitness);
return fitness;

或者,只是不要使用引用原始目标的函数。相反,请使用this

const fitness = {
    staticFunction() { return true },
    normalize(a, b) {
        return (this.staticFunction()) ? a+b : 0;
    }
};