2013-07-15 1 views
0
var BigObject = (function() { 

    function deepCalculate(a, b, c) { 
    return a + b + c; 
    } 

    function calculate(x) { 
    deepCalculate(x, x, x); 
    } 

    return { 
    calculate: calculate, 
    api: {   
     deepCalculate: deepCalculate 
    } 
    } 
})(); 

이것은 개인 기능을 가진 기본 자체 실행 기능입니다. api에 보관합니다. 내가 가지고있는 문제는 이제 함수 외부에서 deepCalculate을 덮어 쓸 수 없다는 것입니다.참조 대신 함수를 다시 쓸 수 있습니까?

어떻게 문제입니까? Jasmine을 사용하고 함수가 호출되었는지 테스트하려고합니다. 예 :

spyOn(BigObject, 'calculate').andCallThrough(); 
expect(BigObject.api.deepCalculate).toHaveBeenCalled(); 

이 실패합니다. 그러나 내가 디버깅 할 때, 나는 재 스민이 스파이로 BigObject.api.deepCalculate을 묶는다는 것을 확신하지만, 내부에서 여전히 원래의 deepCalculate 함수를 호출하고 스파이가 아닌 함수를 호출한다.

나는 함수에 대한 참조가 아니라 어떻게 덮어 쓸 수 있는지 알고 싶습니다.

+0

마지막 줄에 중괄호가 없습니다. –

+0

예, 그렇다고해도 별 차이가 없습니다. 그것은 단지 목적을위한 것입니다. –

답변

0

간단한 대답은 다음과 같습니다 내가 그런 말을해야하지만, 내가 심각하게 당신이해야 할 노력하고 무엇이든 acchieve하는 다른 방법에 대해 생각할 것

(function() 
{ 
    var overWriteMe = function(foo) 
    { 
     return foo++; 
    }, 
    overWrite = function(newFunc) 
    { 
     for (var p io returnVal) 
     { 
      if (returnVal[p] === overWriteMe) 
      {//update references 
       returnVal[p] = newFunc; 
       break; 
      } 
     } 
     overWriteMe = newFunc;//overwrite closure reference 
    }, 
    returnVal = { 
     overWrite: overWrite, 
     myFunc: overWriteMe 
    }; 
}()); 

. 폐쇄 인 IMO는 전체적으로 취급되어야합니다. 그것의 일부를 곧 대체하게되면 곧 악몽이 될 것입니다. 어떤 시점에서 어떤 시점에서 어떤 기능이 변경되었는지, 변경된 시점, 이전 상태, 변경된 이유를 알지 못합니다.
임시 sollution 그냥이 될 수 있습니다

IMO
var foo = (function() 
{ 
    var calc = function(x, callback) 
    { 
     callback = callback || defaultCall; 
     return callback.apply(this, [x]); 
    }, 
    defaultCall(a) 
    { 
     return a*a+1; 
    }, 
    return {calc: calc}; 
}()); 
foo(2);//returns 5 
foo(2,function(x){ return --x;});//returns 1 
foo(2);//returns 5 again 

그것의 핵심 동작을 변경하지 않고, 다른 "내부" 기능을 선택할 수 있도록 한 번 사용으로, 이것은 많은 안전 코드.

관련 문제