在clojurescript中通过deftype创建类型时:
(deftype SomeObject [a b c]
Object
(update [_]
(set! (.-a _) 5)
(set! (.-b _) 6) ))我想在创建对象时对其进行一些初始化!
发布于 2013-05-18 17:20:40
在deftype中不支持这一点;Clojure(脚本)的等价物是定义一个工厂函数,可能是make-some-object,然后使用它而不是实际的构造函数。有关示例和基本原理,请参阅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可能需要构造函数作为参数的Interop?)
发布于 2013-05-18 17:05:04
deftype的构造函数有意简化:它只复制N个对象来保存数据字段。没有必要让它变得更强大,因为您已经有了一个工具来完成这项工作:简单的老式函数就是您所需要的。
(defn foo [opts]
(if-not (acceptable? opts)
(throw (Exception. "No way, man"))
(Foo. (:x opts) (:y opts)))是包装deftype构造函数的一个简单示例。即使deftype允许您为“真正”的构造函数注入这种逻辑,在客户端API和底层表示之间创建一个抽象屏障也是很好的,这样即使表示发生变化,客户端代码也基本上不会受到影响。
发布于 2013-05-20 10:07:18
谢谢大家,那我就用工厂方法吧。无论如何,在ClojureScript中可能是最有意义的!我想我将来会尽量避免定义类型/类型,所以工厂方法可以很好地隐藏它。仍处于向函数式编程过渡的阶段;)
https://stackoverflow.com/questions/16621671
复制相似问题