Javascript 在clojurescript中扩展deftype的构造函数
通过clojurescript中的deftype创建类型时:Javascript 在clojurescript中扩展deftype的构造函数,javascript,clojure,clojurescript,Javascript,Clojure,Clojurescript,通过clojurescript中的deftype创建类型时: (deftype SomeObject [a b c] Object (update [_] (set! (.-a _) 5) (set! (.-b _) 6) )) 是否有可能扩展构造函数?我想在创建对象时对其进行一些初始化 deftype的构造函数是有意简化的:它只复制N个对象来保存数据字段。没有必要让它更强大,因为您已经有了一个工具来完成这项工作:您只需要
(deftype SomeObject [a b c]
Object
(update [_]
(set! (.-a _) 5)
(set! (.-b _) 6) ))
是否有可能扩展构造函数?我想在创建对象时对其进行一些初始化 deftype的构造函数是有意简化的:它只复制N个对象来保存数据字段。没有必要让它更强大,因为您已经有了一个工具来完成这项工作:您只需要简单的旧功能
(defn foo [opts]
(if-not (acceptable? opts)
(throw (Exception. "No way, man"))
(Foo. (:x opts) (:y opts)))
是包装deftype构造函数的简单示例。即使deftype允许您向“真实”构造函数注入这种逻辑,在客户端API和底层表示之间创建一个抽象屏障也是很好的,这样当表示发生变化时,客户端代码基本上不会受到影响。deftype中不支持这种逻辑;Clojure(脚本)等价于定义一个工厂函数,可能是
生成一些对象
,并使用它而不是实际的构造函数。参见amalloy的答案,了解示例和基本原理
当然,在JavaScript中,构造函数只是函数,您当然可以使用ClojureScript定义一个函数,该函数将像JS构造函数一样工作:
;; "constructor" with default field values
(defn Point [x y]
(this-as this
(set! (.-x this) (if x x 10)) ; NB. Clojure truth semantics are used
(set! (.-y this) (if y y 20))))
(.-x (Point. 2))
;= 2
(.-y (Point. 2))
;= 20
这有点违背语言的整体精神,因此除非在特殊情况下,否则是不可取的。(与JS API的互操作可能需要一个构造函数作为参数?谢谢大家,我将使用工厂方法。也许在ClojureScript中最有意义!我想我以后会尽量避免使用deftypes/Types,所以工厂方法可以很好地隐藏它。仍处于向函数式编程的过渡阶段;)
(如果x x 10)
只是(或x 10)
。