2012-11-20 2 views
2

JavaScript 함수에 대해 '이전'기능을 수행하려고합니다.실행하기 전에 주어진 함수를 호출하기 위해 함수 프로토 타입을 개선하십시오.

그래서 기존 솔루션을 찾아서 jQuery 용 aop-plugin을 찾았습니다. 불행히도 플러그인은 단순히 주어진 함수를 래핑합니다. 따라서 함수를 향상시키기 전에 원래 함수를 가리키는 모든 객체는 여전히 원래 함수를 가리 킵니다. 이러한 개체에서 함수를 호출하면 확장되지 않은 버전의 함수가 호출됩니다.

다른 함수로 함수를 래핑하는 대신 함수 오브젝트 자체를 변경하려고하므로 이전 참조로 인해 예기치 않은 동작이 발생하지 않습니다. 그래서 다음과 같은 것을 얻었습니다 :

(function(){}).constructor.prototype.before = function(beforeFunction){ 
    this.beforeFunction = beforeFunction; 
}; 

/* some magic should happen here: enhance call? */ 

function logFoo() { 
    console.log("Foo"); 
}; 
function logBar() { 
    console.log("Bar"); 
}; 

logFoo(); // logs "Foo" 

logFoo.before(logBar); 

logFoo(); // should log "Bar", then "Foo" 

그렇다면 향상된 함수가 호출 될 때 beforeFunction을 호출하는 방법은 무엇입니까?

답변

6

함수의 본문, 매개 변수 및 참조 환경이 변경 될 수 없으므로 함수를 향상시킬 수 없으며 새로운 함수 만 만들 수 있습니다.

이처럼 처음부터 기능 enhanceable을 만들 수있는 그런 다음

Function.prototype.enhanceable = function() { 
    var original = this, 
     enhanced = [], 
     ret = function() { 
      for(var i = 0; i < enhanced.length; ++i) { 
       enhanced[i].apply(this, arguments); 
      } 

      return original.apply(this, arguments); 
     }; 

    ret.before = function(fn) { 
     enhanced.push(fn); 
    }; 

    return ret; 
}; 

:

var logFoo = function() { 
    console.log("foo"); 
}.enhanceable(); 

var logBar = function() { 
    console.log("bar"); 
}; 

logFoo(); //foo 

logFoo.before(logBar); 

logFoo(); //logs bar, then foo 
관련 문제