如何在不改变状态的情况下操纵传递给函数的对象的属性

时间:2017-01-16 23:46:57

标签: javascript node.js functional-programming

我想知道是否可以在不改变对象状态的情况下更改传递给函数的对象的属性。

这样的事情:

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个级别的调用。

感谢。

2 个答案:

答案 0 :(得分:2)

当您想要使用函数式语言更新对象时,通常的方法是返回一个新的克隆版本的对象,其中包含一些属性更改(不修改原始对象)。我不认为有一种内置的方法可以在JavaScript中克隆对象,但this post provides a detailed answer。使用该答案中的clone函数,您可以写:

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

如果您有对象o1并且您写了var o2 = startOfLine(o1),那么您将获得一个o2设置startOfLine的新对象,但不会改变o1

如果你没有在任何地方改变对象,你可以执行浅拷贝(并且避免克隆整个对象树),但是仍然有一些开销 - 但你得到了使用不可变对象的好属性,这些对象经常超重成本。

答案 1 :(得分:0)

不幸的是,我没有足够的声誉发表评论。 所以试图根据一些合理的假设来回答。

您正在寻找一种方法来链接一些与单个对象相关的操作,从而提高效率,避免过多的突变或创建新对象。最终的对象应该与应用的转换相同的对象(或副本?)。

如果这是您正在寻找的那个,可以通过使用哈希树以良好的内存效率来完成。 您可以通过Facebook参考库immutable.js

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