2012-10-20 5 views
2
나는 관찰자/청취자 시스템을 설정하려는

:이 경우자바 스크립트 동적 메서드 호출

var listeners = []; 

function MyObj(){ 
    this.myMethod = function(){ 
     // react to event 
    } 
} 

var myObj = new MyObj(); 

function addListener(fn, obj){ 
    alliancesNotify[alliancesNotify.length] = {fn: fn, obj: obj} 
} 

addListener(myObj, myObj.myMethod); // Best way of doing it? 

function notify(objArr){ 
    for (var i in objArr){ 
     objArr[i].obj.fn(); // will this work? 
    } 
} 

notify(listeners); 

두 줄을 주석에 내가 (expceted대로 실제로 작동 할 경우), 귀하의 의견을 기대하고 아마도 메소드 호출을 통해 객체에 알리는보다 직접적인 방법 일 것입니다. (예를 들어 내가 어떤 구현 대신이 방법을 대신 함수에 대한 참조의 문자열로 함수 이름을 전달 나타났습니다.)

감사

답변

2

이 좋아 거기에 여러 문제가 먼저 그들에게 하나를 수행 할 수 있습니다 1 대 :

  • objArr[i].obj.fn(); 기대하는대로하지 않을 것입니다. 그것은 fn 메소드를 찾아서 호출 할 것이지만 obj에서 myMethod을 호출하기를 고대하고 있습니다. 이 문제를 해결하려면 여러 가지 옵션이 있습니다. apply 또는 call을 사용하십시오. 따라서 코드는 objArr[i].fn.call(objArr[i].obj)과 비슷합니다. 이것은 JS 라이브러리가 jQuery, Mootools 또는 PrototypeJS와 같은 방식으로 작동하는 좋은 방법입니다.
  • 두 번째 문제는 콜백 함수가 예외를 throw하고 오류가 발생하면 어떻게해야합니까? 일부 브라우저에서는 루프가 반복을 중지하므로 더 이상 콜백 (호출)이 호출되지 않습니다. 솔루션을 여러 번 다시 사용할 수 있습니다. try try catch 블록을 사용하거나 내 fav 방법을 수행하십시오. setTimeout을 사용하면 코드가 아래와 같이 표시됩니다. JS가 단일 스레드 브라우저이므로 콜백 함수를 대기열에 넣고 오류가 발생하더라도 나머지는 영향을받지 않습니다.
 
    function notify(objArr){ 
     for (var i in objArr){ 
      window.setTimeout(function(){ objArr[i].call(objArr[i].obj);}, 0); 
     } 
    } 
1

에 대한 하나의 독립 PUB의 SUB 라이브러리를 작성해야 프로퍼티의 변경을 통지하는 Object.defineProperty