2017-12-22 15 views
0

同じパラメータで複数回呼び出されたメソッドを持つnode.JSアプリケーションがあります。 (最適化問題を試してみる最適化問題)オブジェクトリテラル自己参照を持つES6プロキシインターセプタ

ソースコードはかなり大きく、私はそれに慣れていないし、同じパラメータを使って何回のメソッドが呼び出されているのかを知りたいアルゴのパフォーマンス。

私はそれぞれのパラメータですべてのメソッド呼び出しをインターセプトしようとしています。に格納してください。とメソッド呼び出しと一意のパラメータの違いを参照してください。

私はそうのような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.params.size()log.callsの違いについてログ変数を確認することができます記憶のための最善の候補者。

この手法はうまくいきますが、明らかにオブジェクトリテラル呼び出しを傍受しないことは明らかです。それはwasn以来staticFunction実行した後、私は私のログ変数にノーマライズ機能を持っています

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 
}; 

はなく、:ここ は、それがを失敗した例(プロジェクトからの例モジュール)です傍受されたオブジェクトを呼び出すが、直接フィットネスに。

これらのメソッド呼び出しを傍受する最良の方法は何でしょうか?

答えて

2

あなたはそうのようなプロキシを注入できます。

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

はまた、単に元のターゲットを参照する機能を使用しないでください。代わりに、this

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

ありがとうございました!私は自分でそれを実現していないばかげた餌を食べる。私はそれが素晴らしい作品であることを確認することができます。 – sensor