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

标签 javascript class functional-programming pure-function

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

 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 类就是一个很好的例子,它是纯函数式的。每个返回不同字符串的方法总是返回一个新构造的字符串。想想它是在面向对象的黄金时代构思的,这真是一个壮举。

关于javascript - 纯函数可以使用 `this` 改变其容器类内的其他属性吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54187619/

相关文章:

javascript - 使用 lodash 对数组对象重新排序

python - 有没有办法绕过 Python list.append() 随着列表的增长而在循环中逐渐变慢?

C++ 重载 : [Error] no match for 'operator=' (operand types are 'String' and 'String' )

css - jQuery UI 如何避免提交按钮获取 css 类?

functional-programming - 遵循哪种编程实践来评估方案中的表达式

javascript - 从从 JQuery 调用的文件中使用 AJAX 调用文件

javascript - 如何在 javascript 中验证和限制数字数据的 asp.net 文本框控件的长度?

c# - 循环的 Lambda 表达式转换以显示列表

r - R 中恒等函数的实际用途是什么?

javascript - 按 shift + a + s 键事件不起作用