構造當通過DEFTYPE在clojurescript創建類型:擴展一個DEFTYPE的clojurescript
(deftype SomeObject [a b c]
Object
(update [_]
(set! (.-a _) 5)
(set! (.-b _) 6)))
是否有延長構造的可能性?我想在創建對象時進行一些初始化操作!
構造當通過DEFTYPE在clojurescript創建類型:擴展一個DEFTYPE的clojurescript
(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
中沒有支持,no; 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期待一個構造函數作爲一個參數也許?)
謝謝你們,我會用工廠方法。無論如何,在ClojureScript中可能最有意義!想想我將來會盡量避免使用deftypes/Types,所以工廠方法可以很好地隱藏它。仍處於功能編程的過渡階段;)
'(如果x x 10)'只是'(或x 10)'。 – amalloy