菜单

对象与数据结构

相关源文件

目的与范围

本文档涵盖了在 JavaScript 中处理对象和数据结构的最佳实践。它侧重于适当的封装技术、数据隐藏原则和接口设计,以确保您的代码保持可维护并遵循简洁代码原则。有关类设计和实现的信息,请参阅 Classes

对象和数据结构简介

在 JavaScript 中,对象和数据结构是组织和存储数据的首要手段。然而,这两个概念之间存在一个关键的区别

  • 对象:将数据隐藏在抽象之后,并公开操作这些数据的函数
  • 数据结构:公开其数据,且没有有意义的函数

理解何时使用哪种方法对于编写简洁、可维护的代码至关重要。

标题:JavaScript 中的对象与数据结构

来源:README.md1039-1140

使用 getter 和 setter

通过 getter 和 setter 访问对象上的数据,与直接操作属性相比具有几个优势。此技术有助于强制执行封装并增加代码的灵活性。

Getter 和 Setter 的优势

优点描述
面向未来您可以在不更改访问器调用的情况下修改实现
验证设置值时轻松添加数据验证
封装隐藏数据的内部表示
日志记录在数据访问周围添加日志记录或错误处理
延迟加载按需加载属性(例如,从服务器加载)

实现示例

以下示例演示了直接属性访问与使用 getter/setter 之间的区别

标题:直接属性访问与 Getter/Setter 模式

来源:README.md1042-1098

示例代码

当查看存储库中的示例时,我们可以看到 getter/setter 方法与直接属性访问相比提供了更好的封装

在糟糕的实现中,银行账户的余额是直接暴露的

在改进的实现中,余额是私有的,并通过方法访问

来源:README.md1056-1098

对象中的私有成员

JavaScript 提供了几种创建具有私有成员的对象的方法,这有助于保持适当的封装。此模式对于隐藏实现细节并仅公开必要内容至关重要。

使用闭包创建私有成员

闭包为在 JavaScript 中创建私有变量提供了一种机制,尤其是在 ES5 及更早版本中。通过在函数作用域内但返回对象之外定义变量,您可以创建真正私有的数据,这些数据无法直接访问。

标题:基于闭包的私有成员

来源:README.md1102-1138

示例实现

存储库通过 Employee 示例演示了此模式

在糟糕的实现中,姓名是直接可访问的,并且可以被删除

在改进的实现中,姓名是私有的,无法修改或删除

来源:README.md1106-1138

数据访问模式比较

下图说明了 JavaScript 对象中不同的数据访问方法

标题:JavaScript 中的封装模式

来源:README.md1039-1140

与其他简洁代码原则的关系

对象和数据结构原则与存储库中的其他简洁代码概念相关

相关概念关系
单一职责封装良好的对象通常专注于一个职责领域
开闭原则稳定的接口允许在不修改客户端代码的情况下进行扩展
依赖倒置对象应依赖于抽象(接口),而不是实现
函数设计对象上的方法应遵循简洁函数设计原则

标题:对象与其他简洁代码概念之间的关系

来源:README.md1039-1140 README.md1142-1376 README.md1380-1828

最佳实践总结

  1. 使用 getter 和 setter 来控制对对象属性的访问
  2. 使用闭包创建私有成员以隐藏实现细节
  3. 选择对象和数据结构时,请考虑您的数据需求
  4. 尊重封装,不要暴露内部实现细节
  5. 设计稳定的接口,使其能够演进而不会破坏客户端代码

来源:README.md1039-1140