2012-01-26 15 views
11

'da yöntemleri ve yapıcı ile bir JS Nesnesi nasıl oluşturabilirim? Görevin, JS'den kullanılabilmesi için clojurescript'te bazı yardımcı program kütüphanesi oluşturmak olduğunu düşünün. ÖrneğinClojureScript

, ı bir eşdeğerini üretmek isteyen diyelim: Beraber geldiğim bunu başarmak için

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  

Bir şekilde geçerli:

(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 

Soru:/daha şık deyimsel var Yukarıdaki clojurescript yolu?

cevap

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 

Bunu yapmanın deyimsel yolu mu.

+0

teşekkür, aslında deyimsel görünüyor ama (biz lib js inşa ediyoruz), js gelen çağrı yapamazsınız : cljs.user.afoo.bar (3) nereye yapabilirsiniz: cljs.user.x.bar (3) js tarafında bir adresinin deyimsel sürümünü kullanmak için aramak zorunda: cljs.user.afoo.cljs $ kullanıcı $ IFoo $ bar (null, 3) Bir şey mi eksik? – Lambder

+0

@ user535149 bu gerçekten farklı bir soru. Bir şey kullanmak istiyorsanız (defn ^: export foo [..] ...) – dnolen

+0

^: 'işlevi' bir işlev olduğu sürece dışa aktarılır. Yöntemleri prototipinde tanımlanmış bir nesneyi vermek istiyorum. – Lambder

14

Bu deftype için sihirli "Nesne" protokolünü ekleyerek JIRA CLJS-83 ile çözüldü:

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

Zaman damgasını not edin. Bu cevap aslında 26 Ocak 2012'de dnolen'den bir yıl sonra geldi (yaklaşık bir yıl sonra) ve bu çok daha zarif görünüyor. –

İlgili konular