Как мне создать объект JS с методами и конструктором в ClojureScript

Представьте, что задача состоит в том, чтобы создать некоторую служебную библиотеку в clojurescript, чтобы ее можно было используется из JS.

Например, скажем, я хочу создать эквивалент:

    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
задан Lambder 26 January 2012 в 12:49
поделиться