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

Ada*_*deg 4 protocols clojurescript

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

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

cljs.user> (get o "foo") ; => 42 ; in cljs console
Run Code Online (Sandbox Code Playgroud)

由于我只查询表单,但不修改它们,我认为它足以实现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)))
Run Code Online (Sandbox Code Playgroud)

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

dno*_*len 9

你正在修改Object原型,你不想这样做,以下是更好的:

(extend-protocol ILookup
  object
  (-lookup [m k] (aget m k))
  (-lookup [m k not-found] (or (aget m k) not-found)))
Run Code Online (Sandbox Code Playgroud)