我知道纯函数不应突变未作为参数传递的状态,但是我不知道this
关键字是否是该规则的例外。这是我在想的一个简单例子:
class Car {
color: string = 'red';
make: string = 'Dodge';
constructor() {}
changeMake(newMake: string): string {
this.color = 'blue'; // <-- Is this impure?
return newMake;
}
}
这不纯吗?为什么,或者为什么不呢?
答案 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的黄金时代构想时,这是一个非凡的壮举。