2017-12-22 14 views
0

동일한 매개 변수를 여러 번 호출하는 메소드가있는 node.JS 앱이 있습니다. (최적화 문제를 시도하는 조합)객체 리터럴 자체 참조가있는 ES6 Proxy 인터셉터

소스 코드가 꽤 크고 익숙하지 않아요. 동일한 매개 변수로 여러 번 호출 된 메서드를 기억하고 개선하기 위해 노력하고 있습니다. 알 고의 성능.

그래서 각각의 매개 변수를 사용하여 모든 메서드 호출을 가로 채고 집합에 저장하고 () 메서드 호출과 고유 매개 변수 간의 차이점을 확인하십시오.

나는과 같이 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의 차이에 대한 로그 변수를 검토 할 수 있습니다 암기에 가장 적합한 후보자.

이 기법은 훌륭하게 작동하지만 분명히 객체 리터럴 호출을 가로 채지 않습니다. 여기 은 (프로젝트에서 예 모듈) 실패 예를 경우 : 로그 변수에 기능을 정상화 내가해야 실행 후

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

하지만 년후하지 staticFunction 이후 도청 된 물체를 호출했지만 직접 피트니스에 있습니다.

이러한 메서드 호출을 가로채는 가장 좋은 방법은 무엇입니까?

답변

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