2013-06-03 53 views
4

我有一個代碼庫,可以大量使用getget-in嵌套窗體。我希望能夠使用原生JavaScript對象,而不用(很多)代碼重寫。在ClojureScript中擴展協議以從本機js對象獲得價值

js> cljs.user.o = {foo: 42} // in js console 

cljs.user> (get o "foo") ; => 42 ; in cljs console 

因爲我只查詢形式,但不對其進行修改,我認爲這將足以實現get(其中get-in依賴)。這是我的嘗試,

(extend-protocol ILookup 
    js/Object 
    (-lookup [m k] (aget m k)) 
    (-lookup [m k not-found (or (aget m k) not-found))) 

它似乎工作,但它以一種奇怪的方式打破了很多事情。

回答

9

您正在修改的對象的原型,你不想這樣做,下面的更好:

(extend-protocol ILookup 
    object 
    (-lookup [m k] (aget m k)) 
    (-lookup [m k not-found] (or (aget m k) not-found))) 
+1

只是一個完美的答案,我不清楚的問題:) –

+0

@tomconnors無需添加文本供審閱者刪除;你可以加一些' 的 –

+0

哦,沒有想到這一點,謝謝! – tomconnors