как будет реализовано соглашение о вызовах (‹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/мастер/клиент/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