2012-03-25 14 views
13

मैं क्लोजरस्क्रिप्ट में जावास्क्रिप्ट ऑब्जेक्ट गुणों को कैसे एक्सेस करना है, यह जानने का प्रयास कर रहा हूं। अगर मैं पहले से ही संपत्ति का नाम जानता हूं, तो यह आसान है। foo.bar प्राप्त करने के लिए मैं बस करक्लोजरस्क्रिप्ट इंटरऑप

(.-bar foo) 

वहाँ एक संपत्ति जिसका नाम ही कार्यावधि में जाना जाता है का उपयोग करने के लिए एक रास्ता है? मैं केवल कार्यावधि में जाना जाता है का उपयोग करने के लिए गुण जे एस वाक्य रचना foo[dynamicBar]

उत्तर

19

आप उपयोग कर सकते हैं aget/Aset के बराबर रहा हूँ।

;; 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

कोई यह जानना चाहता है कि यह (कम से कम आज) संभव है (जेएस-ओबीजे "बार" 100) ', जेएस * की आवश्यकता से परहेज करें। –

0

स्ट्रिंग नाम का उपयोग मामले में भी महत्वपूर्ण हो सकते हैं जब आप का लाभ लेने के लिए चाहते हैं: अनुकूलन: उन्नत संकलक मोड, लेकिन आप की जरूरत नहीं है externs अपने कोड को कवर दायर करें।

देखें डेविड Nolen के उदाहरण goog.object.get का उपयोग कर: https://github.com/clojure/clojurescript/wiki/Dependencies#using-string-names

जबकि aget काम करता है। यह विधि मूल रूप से आपको सरणी तत्वों तक पहुंच प्रदान करने के लिए माना जाता था, सामान्य रूप से जेएस ऑब्जेक्ट्स की गुण नहीं। goog.object की विधि आपके इरादे को संवाद करने का एक बेहतर तरीका है।

यहाँ दोनों तरीकों का कार्यान्वयन हैं: 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

आप देख सकते हैं, (aget o key) जावास्क्रिप्ट कोड o[key] सीधे उत्पन्न करता है लेकिन goog.object.get एक तरीका है जिसके पहले जांच करता है कि कुंजी कॉल ओ में मौजूद है

+0

आईएमएचओ goog.object.get का उपयोग सीधे क्लोजरस्क्रिप्ट में एक विरोधी पैटर्न है। यह uglier कोड के लिए बनाता है। यदि चेक चाहता है तो इसके बिना इसे रखना आसान है। यदि यह आम तौर पर चाहता था तो तर्कसंगत aget को ऐसा करना चाहिए या ऐसा करने के लिए एक वैकल्पिक पैरामीटर होना चाहिए। या कोई आसानी से अपना खुद का रोल कर सकता है। ज्यादातर जगह बदसूरत बंद करने के लिए पूरी जगह को रखने के लिए कुछ भी बेहतर है। –

संबंधित मुद्दे