javascript - 纯函数可以使用 `this` 改变其容器类中的其他属性吗?
问题描述
我知道纯函数不应该改变未作为参数传入的状态,但我不知道this
关键字是否是该规则的例外。这是我在想的一个简单示例:
class Car {
color: string = 'red';
make: string = 'Dodge';
constructor() {}
changeMake(newMake: string): string {
this.color = 'blue'; // <-- Is this impure?
return newMake;
}
}
这是不纯的吗?为什么或者为什么不?
解决方案
不,你不能改变属性,因为这会改变值(对象),这是一个副作用。纯方法可以公开它们的数据,但永远不会改变它们。它们可以创建新对象,然后它们被认为是纯对象:
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 的黄金时代构思时,这是一个相当大的壮举。
推荐阅读
- bash - 优雅地克隆一个 git org 完整仓库
- ruby-on-rails - Rails:收藏产品并使用 ajax 作为收藏/取消收藏按钮
- php - 尝试对 wordpress 插件使用作曲家自动加载时“找不到类”
- xml - 使用 XSLT 1.0 对输出进行分组
- asp.net - 转换为 N 层架构
- unit-testing - VS2017 - 添加测试项目后解决方案响应非常慢(x-unit)
- javascript - openlayers 中的 Javascript 导入
- cplex - CPLEX 中的线性优化
- javascript - 从 ui bootstrap modal 控制器调用函数
- phpmailer - 我正在发送带有图像的电子邮件。我只有二进制代码。有没有办法将它发送到电子邮件正文?