2014-12-09 1 views
1

개체 속성은 단순 속성 또는 함수 일 수 있습니다. CoffeeScript에서이 속성의 value을 얻는 쉬운 방법이 있습니까?함수 또는 속성 getter를 호출하는 CoffeeScript 관용구

value = if typeof obj.property is "function" then obj.property() else obj.property

+0

당신이 이것을 원한다면 CoffeeScript를 그렇지 않은 것으로 만들기 위해 노력하고 있다고 생각합니다. 'if' 문에서 객체 메서드의 모든 단일 액세스를 래핑하고 싶습니까? 속성에 액세스하는지 또는 메소드를 호출하는지 여부를 알아야합니다. – meagar

+0

일반적인 패턴입니다. 명명 된 속성은 단순한 속성이거나 복잡한 기능 일 수 있습니다. 이 질문에 대한 이유는 정확하게이 끔찍한 코드에서 이러한 모든 과제를 래핑하지 못하게하기 위해서입니다. – philk

+1

다른 언어 *의 일반적인 패턴입니다. – meagar

답변

1

가 관용적 인 경우 나도 몰라하지만 당신은 사용할 수 있습니다 (학대?)이 목적을 위해 existential operator.

typeof obj.p === "function" ? obj.p() : void 0 

p 함수 인 경우 그래서,이 호출 될 것이다, 그렇지 않으면 당신은 undefined을 얻을 :

obj.p?() 
# ---^ 

커피 스크립트가 그 변환합니다 :

당신은 이런 말을합니다. obj.p?()가 정의되지 않은 경우 다음 당신은 obj.p 다시 가을에 또 다른 존재 운영자에 던져 수 있습니다

obj = 
    u: -> undefined 

다음 obj.u?() ? obj.u 당신에게 줄 것이다 : 당신이있는 경우

obj.p?() ? obj.p 

는하지만이에 전체가 함수가 반환하는 undefined보다는 전체 함수 백입니다. 당신이 그 가능성에 직면해야하는 경우 나는 당신이 당신의 자신의 함수를 작성 붙어 있다고 생각 :

prop = (x) -> 
    # Argument handling and preserving `@` is left as an exercise 
    if typeof x == 'function' 
     x() 
    else 
     x 

하고 x = prop obj.maybe_function_maybe_not 말.

데모 : http://jsfiddle.net/ambiguous/hyv6pdtc/

당신이 주변에 밑줄을 가지고 있다면, 당신이 result 기능입니다 사용할 수 있습니다 명명 된 재산의 값이면

결과_.result(object, property)

그런 다음 함수는 오브젝트 컨텍스트로 호출합니다. 그렇지 않으면 반환하십시오.

+0

감사합니다. 나는 밑줄을 사용하지 않고 WinJS를 사용하고있다. 나는이 기능을 쉽게 거기에 주입 할 수있다. 아이스 CS가이 상자를 지원하는지 궁금합니다. – philk