2012-03-25 29 views
13

Tôi đang cố gắng tìm hiểu cách truy cập các thuộc tính đối tượng Javascript trong ClojureScript. Nếu tôi biết trước tên của tài sản, điều đó thật dễ dàng. Để có được foo.bar Tôi chỉ làmClojureScript interop

(.-bar foo) 

Có cách nào để truy cập vào một tài sản mà tên tuổi được biết đến chỉ trong thời gian chạy? Tôi đang tìm kiếm tương đương với cú pháp JS foo[dynamicBar]

Trả lời

19

Bạn có thể sử dụng aget/aset để truy cập các thuộc tính chỉ được biết khi chạy.

;; Use clj->js to convert clj(s) map to javascript. 
;; Note the #js {:bar 100} reader literal indicating a js map. 

cljs.user> (def foo (clj->js {:bar 100})) 
#js {:bar 100} 
cljs.user> (.-bar foo) 
100 
cljs.user> (aget foo "bar") 
100 
cljs.user> (aset foo "baz" 200) 
200 
cljs.user> (.-baz foo) 
200 
+1

Người ta có thể muốn biết rằng đó là (ít nhất là ngày nay) có thể sử dụng '(js-obj" bar "100)', tránh sự cần thiết của js *. –

0

Sử dụng tên chuỗi cũng có thể quan trọng trong trường hợp bạn muốn tận dụng: tối ưu hóa: chế độ trình biên dịch nâng cao, nhưng bạn không có tệp bên ngoài bao gồm mã của mình.

dụ Xem David Nolen bằng cách sử dụng goog.object.get: https://github.com/clojure/clojurescript/wiki/Dependencies#using-string-names

Trong khi aget công trình. Phương pháp này ban đầu được cho là cung cấp cho bạn quyền truy cập vào các phần tử mảng, chứ không phải thuộc tính của các đối tượng js nói chung. Phương thức get của goog.object là cách tốt hơn để truyền đạt ý định của bạn.

Dưới đây là việc triển khai của cả hai phương pháp: https://github.com/google/closure-library/blob/1b8a893271d790626b5cd652b922675c987f106d/closure/goog/object/object.js#L403

https://github.com/clojure/clojurescript/blob/d2d031605b1ad552077218c8f445868653c01744/src/main/clojure/cljs/core.cljc#L942

Như bạn thấy, (aget o key) tạo mã javascript o[key] trực tiếp, nhưng goog.object.get gọi một phương pháp mà kiểm tra đầu tiên nếu phím có mặt trong o.

+0

IMHO sử dụng goog.object.get trực tiếp là một mẫu chống trong clojurescript. Nó làm cho mã xấu hơn. Nếu kiểm tra là muốn nó là dễ dàng, đủ để đưa vào mà không có điều này. Nếu nó thường muốn sau đó được cho là aget nên làm điều đó hoặc có một tham số tùy chọn để làm điều đó. Hoặc người ta có thể đơn giản cuộn của riêng mình. Hầu hết mọi thứ là thích hợp hơn để đặt tên đóng cửa xấu xí đầy đủ tất cả các nơi. –