2013-05-18 44 views
2

構造當通過DEFTYPE在clojurescript創建類型:擴展一個DEFTYPE的clojurescript

(deftype SomeObject [a b c] 
    Object 
     (update [_] 
      (set! (.-a _) 5) 
      (set! (.-b _) 6))) 

是否有延長構造的可能性?我想在創建對象時進行一些初始化操作!

回答

2

deftype的構造函數是故意簡約的:它只是複製N個對象來保存您的數據字段。沒有必要讓它更強大,因爲你已經有了一個工具來完成這項工作:只需要簡單的舊功能。

(defn foo [opts] 
    (if-not (acceptable? opts) 
    (throw (Exception. "No way, man")) 
    (Foo. (:x opts) (:y opts))) 

是一個簡單的包裝deftype構造函數的例子。即使deftype允許您使用這種邏輯來嵌入「真實」構造函數,在客戶端API和底層表示之間創建一個抽象障礙是很好的,這樣如果代表更改,客戶端代碼可以主要不受影響。

3

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期待一個構造函數作爲一個參數也許?)

+1

'(如果x x 10)'只是'(或x 10)'。 – amalloy

0

謝謝你們,我會用工廠方法。無論如何,在ClojureScript中可能最有意義!想想我將來會盡量避免使用deftypes/Types,所以工廠方法可以很好地隱藏它。仍處於功能編程的過渡階段;)