纯函数可以使用`this`改变容器类中的其他属性吗?

时间:2019-01-14 19:03:43

标签: javascript class functional-programming pure-function

我知道纯函数不应突变未作为参数传递的状态,但是我不知道this关键字是否是该规则的例外。这是我在想的一个简单例子:

 class Car {
    color: string = 'red';
    make: string = 'Dodge';

    constructor() {}

    changeMake(newMake: string): string {
      this.color = 'blue';  // <-- Is this impure?
      return newMake;
    }
  }

这不纯吗?为什么,或者为什么不呢?

1 个答案:

答案 0 :(得分:3)

否,您无法对属性进行突变,因为这会更改值(对象),这是一个副作用。纯方法可以公开其数据,但永远不会更改它们。他们可以创建新对象,然后将它们视为纯对象:

class Car {
    color: string;
    make: string;

    constructor(color = 'red', make = 'Dodge') {
        this.color = color; 
        this.make = make;
    }

    changeMake(newMake: string): Car {
        return new Car(this.color, newMake);
    }
}

这将使用新品牌创建原始汽车的副本,因此使用旧对象的每个位置仍然具有旧对象。

Java String类就是一个很好的例子,它是纯函数式的。每个返回不同String的方法总是返回一个新构造的方法。当考虑到它是在OO的黄金时代构想时,这是一个非凡的壮举。