首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在clojurescript中扩展deftype的构造函数

在clojurescript中扩展deftype的构造函数
EN

Stack Overflow用户
提问于 2013-05-18 15:08:11
回答 3查看 898关注 0票数 2

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

代码语言:javascript
复制
(deftype SomeObject [a b c]
    Object
        (update [_]
            (set! (.-a _) 5)
            (set! (.-b _) 6) ))

我想在创建对象时对其进行一些初始化!

EN

回答 3

Stack Overflow用户

发布于 2013-05-18 17:20:40

deftype中不支持这一点;Clojure(脚本)的等价物是定义一个工厂函数,可能是make-some-object,然后使用它而不是实际的构造函数。有关示例和基本原理,请参阅amalloy的答案。

当然,在JavaScript中,构造函数就是简单的函数,您当然可以使用ClojureScript来定义一个函数,该函数的工作方式与JS构造函数类似:

代码语言:javascript
复制
;; "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?)

票数 3
EN

Stack Overflow用户

发布于 2013-05-18 17:05:04

deftype的构造函数有意简化:它只复制N个对象来保存数据字段。没有必要让它变得更强大,因为您已经有了一个工具来完成这项工作:简单的老式函数就是您所需要的。

代码语言:javascript
复制
(defn foo [opts]
  (if-not (acceptable? opts) 
    (throw (Exception. "No way, man"))
    (Foo. (:x opts) (:y opts)))

是包装deftype构造函数的一个简单示例。即使deftype允许您为“真正”的构造函数注入这种逻辑,在客户端API和底层表示之间创建一个抽象屏障也是很好的,这样即使表示发生变化,客户端代码也基本上不会受到影响。

票数 2
EN

Stack Overflow用户

发布于 2013-05-20 10:07:18

谢谢大家,那我就用工厂方法吧。无论如何,在ClojureScript中可能是最有意义的!我想我将来会尽量避免定义类型/类型,所以工厂方法可以很好地隐藏它。仍处于向函数式编程过渡的阶段;)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16621671

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档