как ще бъде приложена конвенцията за извикване (‹map› ‹key›) за js-обекти?

Бих искал да мога да използвам (js-obj) като хеш-карта, така че

 (def a (js* "{'a': 1, 'b':2}"))

 (a :a)
 ;=> 1

Опитах да направя това:

 (extend-type object
   IFn
   (-invoke
     ([o k] (aget o (strkey k))))

но не се получи.


person zcaudate    schedule 08.05.2013    source източник
comment
Може би трябва да използвате js/Object вместо object?   -  person Rodrigo Taboada    schedule 09.05.2013
comment
о, уау, проработи! Работех върху примера тук: github.com/pangloss /clang/blob/master/client/clang/   -  person zcaudate    schedule 09.05.2013
comment
добре... разбрах, че не е толкова добра идея... jquery се счупи, когато го направих   -  person zcaudate    schedule 09.05.2013


Отговори (1)


Можете да използвате use reify. Обърнете внимание, че тогава няма да имате директен достъп до свойствата:

(defn convert [obj]
  (reify
    IFn
    (-invoke [obj]
      ([o k] (aget o (strkey k))))))

Разбира се, можете да напишете протокол, за да имате достъп до оригиналния обект, ако желаете.

person dnolen    schedule 21.05.2013