2012-10-11 3 views
4

체인 전화를 끊을 수있는 방법이 있습니까?체인 전화를 끊을 방법이 있습니까?

if (obj && obj.prop && obj.prop.subProp1 && obj.prop.subProp1.subPropFunc) { 
    obj.prop.subProp1.subPropFunc(); 
} 

내가 생각할 수있는 유일한 대안은 try-catch입니다. 다른 아이디어?
* 나는 이것들을 쓰는 것에 정말로 지쳤다. 을 사용하면 에서 훨씬 쉽습니다.

답변

1
이 ("모든 경우에"샘플의 단지 사본 테스트를하지 않은 경우) 샘플 코드를 제공 작동합니다

: 그 중 첫 번째

function propsExist(obj) { 
    if (!obj) return false; 
    for (var i = 1; i < arguments.length; i++) { 
     if (!obj[arguments[i]]) return false; 
     obj = obj[arguments[i]]; 
    } 
    return true; 
} 

if (propsExist(obj, "prop", "subProp1", "subPropFunc")) { 
    obj.prop.subProp1.subPropFunc(); 
} 

가변 인자를받는 propsExist() 방법을, 속성/기능을 확인하려는 원본 개체입니다. 그것은 당신이 그것을 보내고 그것을 순서대로 검사하는 속성 목록을 반복합니다. 존재하지 않으면 false을 반환합니다. 그것은 전체 루프를 통해 그것을 만드는 경우, 그것은 성공적으로 검증! 당신이 항상 그것의 유효성을 확인하면 하위 속성의 함수를 호출 할 경우

, 당신은 또한 단지 대신 진정한 반환하는 호출하는 propsExist 기능을 변경할 수 있습니다 (다음 callIfValid(obj, ...)

1

같은 같은 것을 할 수있는 기능의 이름을 변경 아이디어는 이전 게시물로, 단지 다른 해결책입니다.

function checkChain(variablePath,startingPoint){ 
    var check = startingPoint || window, 
     parts = variablePath.split("."), 
     i; 

    for (i=0;i<parts.length;i++) { 
     check = check[parts[i]]; 
     if (!check) { 
      return null; 
     } 
    } 
    return check; 
} 

var foo = { bar : { cat : { says : function(x){ alert(x); } } } }; 

var test1 = checkChain("foo.bar.cat.says"); 
if (test1) { 
    test1("meow"); 
} 

var test2 = checkChain("foo.bar.cat.bark"); 
if (test2) { 
    test2("burp"); 
} 

var test3 = checkChain("cat.says",foo.bar); 
if (test3) { 
    test3("huh?"); 
} 
관련 문제