首页 > 解决方案 > 纯函数可以使用 `this` 改变其容器类中的其他属性吗?

问题描述

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

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

    constructor() {}

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

这是不纯的吗?为什么或者为什么不?

标签: javascriptclassfunctional-programmingpure-function

解决方案


不,你不能改变属性,因为这会改变值(对象),这是一个副作用。纯方法可以公开它们的数据,但永远不会改变它们。它们可以创建新对象,然后它们被认为是纯对象:

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 类,它是纯函数式的。每个返回不同字符串的方法总是返回一个新构造的方法。当认为它是在 OO 的黄金时代构思时,这是一个相当大的壮举。


推荐阅读