本文探讨了在 JavaScript 中使用函数组合替代面向对象编程中继承的策略,以解决继承带来的类层次结构僵化和可重用性问题。
首先,文章展示了一个使用 ES5 class 实现继承的示例,分别定义了 animal、dog 和 cat 类,其中 dog 和 cat 继承自 animal。 随后,文章引入了 user 实体,并说明了如果为 user 添加与 animal 相同的功能(吃饭、睡觉、玩耍),将会导致类层次结构的膨胀和“上帝对象”反模式的出现。
文章指出,面向对象编程中继承的局限性在于其隐式环境和紧密耦合,导致可重用性降低。 为了解决这个问题,文章提出了一种基于函数组合的替代方案。 它将动物的行为(吃饭、睡觉、玩耍、吠叫、喵喵)定义为独立的函数,这些函数接受对象状态作为参数,并通过闭包来访问和修改对象状态。
例如,eater 函数接受一个对象作为参数,并返回一个包含 eat 方法的对象;sleeper 函数类似地定义了 sleep 方法。 通过 Object.assign,可以将这些函数生成的包含行为的方法合并到具体的动物实例(例如 dog 实例)中。
这种方法的优势在于,它避免了类层次结构的复杂性,并提高了代码的可重用性。 user 实体可以简单地通过组合 eater、sleeper 和 player 函数来获得与动物相同的功能,而无需修改类层次结构或引入新的基类。 文章最后总结了这种函数组合方法的优势,即摆脱了紧密耦合的继承结构,实现了更高的灵活性和可维护性。