簡體   English   中英

如何在不改變狀態的情況下操縱傳遞給函數的對象的屬性

[英]How to manipulate attributes of an object passed to a function without mutating the state

我想知道是否可以更改傳遞給函數的對象的屬性,而無需改變對象的狀態。

像這樣:

function startOfLine(options) {
  options.someProp = += 'startOfLine';
  return options;
}

function otherFunction(options) {
  // do something with options and...
  return options;
}

const options = startOfLine(otherFunction({
  somePro: '',
  someProp2: ''
}));

我將以動態方式創建函數的執行,這就是為什么我不必擔心嵌套20個級別的調用的原因。

謝謝。

當您想用功能語言更新對象時,通常的方法是返回具有某些屬性更改的對象的新克隆版本(無需修改原始對象)。 我認為沒有內置的方法可以在JavaScript中克隆對象,但是本文提供了詳細的答案 使用該答案中的clone功能,您可以編寫:

function startOfLine(options) {
  var newOptions = clone(options);
  newOptions.someProp = 'startOfLine';
  return newOptions;
}

當您擁有對象o1並編寫var o2 = startOfLine(o1)您將獲得一個具有startOfLine設置但不startOfLine o1的新對象o2

如果您不打算在任何地方更改對象,則可以執行淺表復制(並避免克隆整個對象樹),但是仍然涉及一些開銷-但是您獲得了使用不可變對象的良好屬性,這些屬性通常會增加成本。

不幸的是,我沒有足夠的聲譽來發表評論。 因此,嘗試基於一些合理的假設進行回答。

您正在尋找一種方法,可以更好地鏈接與單個對象相關的某些操作,從而避免過多的突變或創建新對象。 最終對象應該是具有應用轉換的同一對象(或副本?)。

如果這是您要尋找的對象,則可以通過使用哈希樹來實現良好的內存效率。 您可以參考Facebook的immutable.js庫

https://facebook.github.io/immutable-js/

暫無
暫無

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

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