2012-01-26 77 views
11

Hãy tưởng tượng nhiệm vụ là tạo một số tiện ích lib trong clojurescript để nó có thể được sử dụng từ JS.Làm cách nào để tạo một đối tượng JS với các phương thức và hàm tạo trong ClojureScript

Ví dụ, giả sử tôi muốn tạo ra một tương đương với:

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  

Một cách để đạt được điều đó tôi đến với là:

(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 

Câu hỏi: có thêm thanh lịch/thành ngữ cách ở trên trong clojurescript?

Trả lời

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 

Là cách thành ngữ để thực hiện việc này.

+0

Cảm ơn, nó trông giống thành ngữ trong thực tế nhưng bạn không thể gọi từ js, (chúng tôi đang xây dựng js lib) : cljs.user.afoo.bar (3) nơi chúng tôi có thể: cljs.user.x.bar (3) để sử dụng phiên bản ngữ của bạn từ bên js một phải gọi: cljs.user.afoo.cljs $ user $ IFoo $ bar (null, 3) Tôi có thiếu gì đó không? – Lambder

+0

@ user535149 thực sự là một câu hỏi khác. Nếu bạn muốn xuất một cái gì đó sử dụng (defn ^: export foo [..] ...) – dnolen

+0

^: xuất khẩu hoạt động miễn là 'cái gì đó' là một hàm. Tôi muốn xuất một đối tượng có phương thức được định nghĩa trên nguyên mẫu của nó. – Lambder

14

này đã được giải quyết với JIRA CLJS-83 bằng cách thêm một ma thuật "đối tượng" giao thức để các deftype:

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

Lưu ý dấu thời gian. Câu trả lời này thực sự xuất hiện sau câu trả lời của dnolen vào ngày 26 tháng 1 năm 2012 (khoảng một năm sau), và điều này có vẻ thanh lịch hơn nhiều. –

Các vấn đề liên quan