2013-05-08 2 views
2

Я хотел бы иметь возможность использовать (js-obj) как хэш-карту таким образом, чтоКаким образом будет реализовано соглашение о вызове() для js-объектов?

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

(a :a) 
;=> 1 

Я попытался сделать это:

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

, но это не сработало.

+1

Возможно, вам нужно использовать 'js/Object' вместо' object'? –

+0

о, ничего себе! Я работал с примера здесь: https://github.com/pangloss/clang/blob/master/client/clang/js_types.cljs – zcaudate

+0

хорошо ... Я понял, что это не такая отличная идея .... jquery сломался, когда я сделал это – zcaudate

ответ

1

Вы можете использовать использование reify. Обратите внимание, что означает, что вы не сможете получить доступ к свойствам непосредственно затем:

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

Конечно, вы могли бы написать протокол, так что вы можете получить доступ к исходному объекту, если вам нравится.

Смежные вопросы