簡體   English   中英

具有直接屬性訪問權的不可變javascript

[英]Immutable javascript with direct property access

我正在使用包含對象的道具在一組React組件中實現Immutable.js ,而之前從未使用過Immutable。

當我將所有{someProp.someValue}重寫為{someProp.get(“ someValue”)}時 (由於Immutable不能直接訪問道具),我只是想知道是否可以直接擁有對象屬性對象仍然不可變時可訪問。

我猜想原因是,如果可以直接訪問它們,它們將是可變的,因為這就是javascript對象的工作方式。 但是,是否不可能凍結對象(當然,在支持它的瀏覽器中),並且仍然讓變異方法(.set,.map等)創建副本,而不是通過不可變的工作方式更改對象本身?

這在技術上是否可行,是否有任何圖書館已經做好了類似的准備?

“在技術上可行嗎”

是的,您描述的實現可以解決該特定問題,但是Immutable的作用不只是提供不允許直接更改的數據結構:

Immutable提供了持久不變ListStackMapOrderedMapSetOrderedSetRecord 通過使用哈希映射嘗試和向量嘗試(通過Clojure和Scala普及)的結構共享,它們在現代JavaScript VM上非常高效,從而最大限度地減少了復制或緩存數據的需求

Immutable還提供了一個惰性Seq可以高效鏈接諸如mapfilter類的收集方法,而無需創建中間表示。 RangeRepeat創建一些Seq

強調我的。

因此,如果您有一大套嵌套的不可變地圖和列表,並且更改了一個元素(即:您創建了一個新的結構,其中的數據大部分相同,但一項不同),則不可變將能夠共享很多這兩個數據結構之間的數據,使操作更快並且消耗更少的內存。

但是,這意味着someValue值不一定存儲在數據結構的頂部,等待您訪問它。 不可變的對象必須深入內部才能為您找到它,因此需要get

我懷疑您可以使用Symbols (用於隱藏基礎數據結構)和Proxies (用於攔截屬性訪問器)創建非常酷和友好的API,但是實際上不存在瀏覽器支持


“有沒有圖書館在做這樣的事情?”

目前我能想到的最接近的東西是React的不可變助手 為了支持各種各樣的操作,更新語法有點嘈雜,但是您得到的另一端是普通的JavaScript對象和數組。

用JavaScript處理不可變數據要比使用諸如Clojure之類的語言為之難。 但是,我們提供了一個簡單的不變性助手update() ,它使處理這種類型的數據變得更加容易, 而無需從根本上改變數據的表示方式

輔助對象假設您要傳入的對象是隱式不變的,但是沒有理由您也無法完全凍結它們。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM