ES6类通过私有方法(#methodName)和私有字段(#field)封装网络请求逻辑,隐藏URL、headers、token、重试机制及响应解析细节;公有方法仅暴露语义清晰的业务接口,如getUser(id),调用内部#fetchUser并返回标准化数据,外部无法访问或篡改私有成员,且支持后端变更零改造。

ES6 类可以通过私有方法(#methodName)把网络请求逻辑完全封装在内部,外部只能调用语义清晰的公有方法,看不到 URL、headers、重试机制、错误转换等细节。
用私有方法封装请求逻辑,只暴露业务动作
把 fetch、axios 调用、参数拼接、响应解析全部写在私有方法里,公有方法只负责“做什么”,不涉及“怎么做”:
- 私有方法
#fetchUser处理完整的 HTTP 请求流程:构造 URL、设置 token、处理 401 自动刷新、解析 JSON、统一错误格式 - 公有方法
getUser(id)只接收业务参数(如id),内部调用this.#fetchUser(id),返回标准化的用户对象或 Promise - 外部代码无需知道接口路径是
/api/v2/users/:id,也不需要手动加 Authorization header
组合私有字段 + 私有方法,隔离敏感状态
把 token、baseURL、重试次数等配置存在私有字段中,和私有方法配合使用,避免被意外读取或篡改:
-
#baseUrl = 'https://api.example.com'和#token = null不会出现在实例上,console.log(instance)看不到 -
#request()方法内部可安全使用this.#baseUrl拼接地址,外部无法通过instance.#baseUrl访问 - 即使有人尝试
Object.getOwnPropertyNames(instance)或for...in,也枚举不到私有成员
用私有方法做中间转换,隐藏响应结构差异
后端返回的数据结构可能混乱(比如字段名大小写不一、嵌套过深、带冗余元信息),私有方法可以统一清洗,公有方法只交付干净结果:
立即学习“Java免费学习笔记(深入)”;
-
#parseUserResponse(raw)把{ data: { user_name: 'Tom', profile: { age: 30 } } }映射为{ name: 'Tom', age: 30 } - 公有方法
getUser()返回的是这个标准化对象,使用者不用关心原始字段怎么命名 - 如果后端后续改成 GraphQL 或换协议,只需修改私有解析逻辑,所有调用方代码零改动
避免暴露底层类或工具实例
不要把 axios 实例、AbortController 或自定义 RequestClient 导出或挂到 this 上。它们应作为私有实现细节被彻底隐藏:
- ✅ 正确:在类内部
const controller = new AbortController(),仅在#request()中使用,不保存为this.#controller - ❌ 错误:导出
export class ApiClient { constructor() { this.axios = axios.create(...) } }—— 外部可直接调client.axios.get(...),绕过所有封装 - 更进一步:把整个网络层抽成独立模块,类中只
import { request } from './network',再用私有方法包装,实现双层隔离


















