protocols - 在 ClojureScript 中扩展协议(protocol)以从 native js 对象中获取值

标签 protocols clojurescript

我有一个大量使用 get 的代码库和 get-in对于嵌套形式。我也希望能够使用 native javascript 对象,而无需(大量)代码重写。

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)))

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

最佳答案

您正在修改 Object 原型(prototype),您不想这样做,以下更好:

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

关于protocols - 在 ClojureScript 中扩展协议(protocol)以从 native js 对象中获取值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16894465/

相关文章:

swift - 默认实现的 SIMD3 扩展

clojure - 如何在 clojure 中将多个语句写在一个 if block 中?

javascript - ClojureScript 和 Cloud Firestore for Firebase 的兼容性

Clojure:Lein figwheel 和 ClassNotFoundException:javax.xml.bind.DatatypeConverter

swift - 返回通用协议(protocol) swift 的特殊类型的方法

documentation - 有没有办法在 protobuf (proto2) 中创建类型别名?

swift - 在 Swift 中,遵守协议(protocol)的对象是否绝对需要委托(delegate)变量才能使用协议(protocol)?

ios - 符合关联类型协议(protocol)的对象的 Swift 集合

error-handling - 如何在 Clojurescript 中捕获任何 Javascript 异常?

ClojureScript 将一个命名空间拆分为多个文件