[英]Immutable javascript with direct property access
我正在使用包含對象的道具在一組React組件中實現Immutable.js ,而之前從未使用過Immutable。
當我將所有{someProp.someValue}重寫為{someProp.get(“ someValue”)}時 (由於Immutable不能直接訪問道具),我只是想知道是否可以直接擁有對象屬性對象仍然不可變時可訪問。
我猜想原因是,如果可以直接訪問它們,它們將是可變的,因為這就是javascript對象的工作方式。 但是,是否不可能凍結對象(當然,在支持它的瀏覽器中),並且仍然讓變異方法(.set,.map等)創建副本,而不是通過不可變的工作方式更改對象本身?
這在技術上是否可行,是否有任何圖書館已經做好了類似的准備?
“在技術上可行嗎”
是的,您描述的實現可以解決該特定問題,但是Immutable的作用不只是提供不允許直接更改的數據結構:
Immutable
提供了持久不變List
,Stack
,Map
,OrderedMap
,Set
,OrderedSet
和Record
。 通過使用哈希映射嘗試和向量嘗試(通過Clojure和Scala普及)的結構共享,它們在現代JavaScript VM上非常高效,從而最大限度地減少了復制或緩存數據的需求 。
Immutable
還提供了一個惰性Seq
, 可以高效鏈接諸如map
和filter
類的收集方法,而無需創建中間表示。 用Range
和Repeat
創建一些Seq
。
強調我的。
因此,如果您有一大套嵌套的不可變地圖和列表,並且更改了一個元素(即:您創建了一個新的結構,其中的數據大部分相同,但一項不同),則不可變將能夠共享很多這兩個數據結構之間的數據,使操作更快並且消耗更少的內存。
但是,這意味着someValue
值不一定存儲在數據結構的頂部,等待您訪問它。 不可變的對象必須深入內部才能為您找到它,因此需要get
。
我懷疑您可以使用Symbols (用於隱藏基礎數據結構)和Proxies (用於攔截屬性訪問器)創建非常酷和友好的API,但是實際上不存在瀏覽器支持 。
“有沒有圖書館在做這樣的事情?”
目前我能想到的最接近的東西是React的不可變助手 。 為了支持各種各樣的操作,更新語法有點嘈雜,但是您得到的另一端是普通的JavaScript對象和數組。
用JavaScript處理不可變數據要比使用諸如Clojure之類的語言為之難。 但是,我們提供了一個簡單的不變性助手
update()
,它使處理這種類型的數據變得更加容易, 而無需從根本上改變數據的表示方式 。
輔助對象假設您要傳入的對象是隱式不變的,但是沒有理由您也無法完全凍結它們。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.