gpt4 book ai didi

javascript - 具有对象文字自引用的 ES6 代理拦截器

转载 作者:行者123 更新时间:2023-12-01 02:35:44 27 4
gpt4 key购买 nike

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

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

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

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

process.log = {};
process.traceMethodCalls = function (obj) {
return new Proxy(obj, {
get(target, method, receiver) {
if (typeof process.log[method] === 'undefined') {
process.log[method] = { calls: 0, params: new Set() };
}
return function (...args) {
process.log[method].calls += 1;
process.log[method].params.add(JSON.stringify(args));
return target[method].apply(this, args);
};
}
});
}

然后我可以检查 log 变量的 log.callslog.params.size() 之间的差异,以查看最佳候选者便于内存。

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

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 变量中将有 normalize 函数,但没有 staticFunction ,因为它没有在拦截时调用对象,但直接针对健身

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

最佳答案

你可以像这样注入(inject)你的代理:

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

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

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

关于javascript - 具有对象文字自引用的 ES6 代理拦截器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47943564/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com