2012-01-26 1 views
11

JS에서 사용할 수 있도록 clojurescript에 몇 가지 유틸리티 lib를 만드는 것이라고 상상해보십시오. 예를 들어ClojureScript에서 메서드 및 생성자를 사용하여 JS Object를 만드는 방법

,의 내가 동등한 생산한다고 가정 해 보자 : 나는와 함께 그것을 달성하기 위해

var Foo = function(a, b, c){ 
     this.a = a; 
     this.b = b; 
     this.c = c;  
    } 

    Foo.prototype.bar = function(x){ 
     return this.a + this.b + this.c + x; 
    } 

    var x = new Foo(1,2,3); 

    x.bar(3);   // >> 9  

한 가지 방법은 다음과 같습니다

(deftype Foo [a b c]) 

    (set! (.bar (.prototype Foo)) 
     (fn [x] 
     (this-as this 
      (+ (.a this) (.b this) (.c this) x)))) 

    (def x (Foo. 1 2 3)) 

    (.bar x 3)  ; >> 9 

질문 :/더 우아한 관용적있다 clojurescript에서 위의 방법?

답변

11
(defprotocol IFoo 
    (bar [this x])) 

(deftype Foo [a b c] 
    IFoo 
    (bar [_ x] 
    (+ a b c x))) 

(def afoo (Foo. 1 2 3)) 
(bar afoo 3) ; >> 9 

이렇게하는 것은 관용적 인 방법입니다.

+0

감사합니다, 그것은 사실 관용적 보이지만, 당신은 (우리가 LIB JS를 구축하고있다), JS에서 호출 할 수 없습니다 : cljs.user.afoo.bar (3) 여기서 우리가 할 수있는 : cljs.user.x.bar (3) JS 한쪽에서 관용적 버전을 사용하기 위해 는 전화를해야 : cljs.user.afoo.cljs $ user $ IFoo $ bar (null, 3) 내가 뭔가를 놓친 건가요? – Lambder

+0

@ user535149 정말 다른 질문입니다. 뭔가를 내보내고 싶다면 (defn^: export foo [..] ...) – dnolen

+0

^: export는 'something'이 함수 인 한 작동합니다. 프로토 타입에 정의 된 메서드를 가진 객체를 내보내려고합니다. – Lambder

14

이이 DEFTYPE에 마법 "개체"프로토콜을 추가하여 JIRA CLJS-83으로 해결되었다 :

(deftype Foo [a b c] 
    Object 
    (bar [this x] (+ a b c x))) 
(def afoo (Foo. 1 2 3)) 
(.bar afoo 3) ; >> 9 
+2

타임 스탬프에 유의하십시오. 이 답변은 실제로 2012 년 1 월 26 일 (약 1 년 후)에 dnolen이 작성한 것으로 이후 훨씬 더 우아 해 보입니다. –

관련 문제