本文档涵盖了 JavaScript 中类设计的最佳实践。它详细介绍了如何使用现代 JavaScript 语法创建和构建类,何时使用某些模式,以及如何使基于类的代码更清晰、更易于维护。
有关特定对象组合模式的信息,请参阅 组合与继承。
ES2015 (ES6) 引入的 JavaScript 类为创建对象和处理继承提供了更清晰、更直观的语法。尽管 JavaScript 在底层使用基于原型的继承模型,但类语法提供了一种更熟悉的对象蓝图定义方式,特别是对于来自面向类语言的开发者来说。
本文档概述了在 JavaScript 中使用类创建清晰、可维护代码的最佳实践。
现代 JavaScript 类相比旧的构造函数模式,在可读性和可维护性方面具有显著优势。
ES6 类提供了
extendssuper() 进行正确的函数绑定类结构比较
README 文件提供了 ES5 构造函数和 ES6 类在创建继承链方面的对比。ES5 版本需要冗长的代码和手动设置原型链,而 ES6 版本则更为简洁。
ES5 构造函数需要
if (!(this instanceof...)))ES6 类通过以下方式简化
class 和 extends 语法super() 用于父类初始化方法链(Method chaining)是一种模式,可以在同一个对象上按顺序调用多个方法,从而创建更具表达力、更简洁的代码。
实现方法链的关键在于,在修改对象状态的方法中返回对象实例(this)。
方法链实现模式
thisREADME 中的 Car 类示例演示了方法链如何将多个独立的调用转换为单个流畅的表达式。
最重要的类设计原则之一是在大多数情况下偏爱组合而非继承。
根据清晰代码指南,在以下情况下继承是合适的:
README 文件提供了一个滥用继承的例子(Employee 和 EmployeeTaxData),因为税收数据是员工“拥有的”,而不是员工“是”的。
通过组合
README 中的 Employee 示例展示了如何通过创建单独的 EmployeeTaxData 类并在 Employee 类中包含其实例,从而从继承模型重构为组合模型。
与函数类似,类也应该遵循 SOLID 中的单一职责原则 (SRP)。每个类应该只有一个修改的理由。
深度继承层次结构可能导致
类中的方法应遵循与函数相同的原则
JavaScript 现在支持使用 # 前缀的私有字段。考虑
JavaScript 中的类应该遵守 SOLID 原则,这些原则在第 6 部分有更详细的介绍。特别是
通过多态(Airplane 子类)避免条件语句的示例,演示了如何将其中一些原则应用于类设计。