扩展ClojureScript中的协议以从本机js对象获取值

时间:2013-06-03 10:15:05

标签: protocols clojurescript

我有一个代码库,它会大量使用getget-in来嵌套表单。我希望能够使用本机javascript对象,而无需(很多)代码重写。

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

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

由于我只查询表单,但没有修改它们,我认为实现getget-in依赖)就足够了。这是我的尝试,

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

它似乎有效,但它以一种奇怪的方式打破了很多东西。

1 个答案:

答案 0 :(得分:9)

您正在修改Object原型,您不希望这样做,以下情况更好:

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