Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在clojurescript中扩展deftype的构造函数_Javascript_Clojure_Clojurescript - Fatal编程技术网

Javascript 在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个对象来保存数据字段。没有必要让它更强大,因为您已经有了一个工具来完成这项工作:您只需要

通过clojurescript中的deftype创建类型时:

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