当前位置: 首页 > news >正文

JavaScript 实用封装技巧

JavaScript 实用封装技巧


1. 工厂封装

如果需要创建多个结构相似的对象,可以使用工厂函数。

// 创建书籍的工厂函数
function createBook(title, author) {return {title: title,author: author,getDetails() {return `《${this.title}》- 作者: ${this.author}`;},};
}const book1 = createBook("JavaScript 权威指南", "Flanagan");
const book2 = createBook("你不知道的 JavaScript", "Kyle Simpson");console.log(book1.getDetails()); // 输出: 《JavaScript 权威指南》- 作者: Flanagan

2. 闭包封装

有时候,我们不希望外部直接修改对象内部的数据,这时可以利用闭包将状态"藏"起来。

// 封装一个计数器
function createCounter() {let count = 0; // 私有变量,外部无法直接访问return {increment() {count++;console.log(`当前计数: ${count}`);},decrement() {count--;console.log(`当前计数: ${count}`);},getCount() {return count;},};
}const myCounter = createCounter();
myCounter.increment(); // 当前计数: 1
// console.log(myCounter.count); // undefined (无法直接访问)

3. Class 类封装

传统oop方式,更符合面向对象编程习惯。

class Car {constructor(brand, model) {this.brand = brand;this.model = model;this.speed = 0;}// 封装加速行为accelerate(value) {this.speed += value;console.log(`${this.brand} ${this.model} 正在加速,当前时速: ${this.speed}km/h`,);}// 封装刹车行为brake() {this.speed = 0;console.log("车辆已停止。");}
}const myCar = new Car("特斯拉", "Model 3");
myCar.accelerate(50);
myCar.brake();

4. 高阶函数(逻辑委托)

高阶函数是指接收函数作为参数,或者将函数作为返回值的函数。这种封装技巧可以让逻辑变得灵活,适合固定通用逻辑,隔离差异逻辑。

4.1 基础列表处理

// 封装一个通用的列表处理器
function processList(list, callback) {const result = [];for (let i = 0; i < list.length; i++) {result.push(callback(list[i]));}return result;
}const numbers = [1, 2, 3, 4];
const doubled = processList(numbers, (num) => {return num * 2
});
console.log(doubled); // [2, 4, 6, 8]

4.2 异步请求封装 (Fetch)

/*** 封装通用的数据获取函数* @param {string} url 请求地址* @param {function} handleData 处理数据的回调函数*/
async function fetchData(url, handleData) {try {console.log("正在请求数据...");const response = await fetch(url);const data = await response.json();// 封装技巧:不在这里写死处理逻辑,而是调用传入的回调函数handleData(data);} catch (error) {console.error("请求出错:", error);}
}// 使用场景 1:打印用户信息
fetchData("https://api.example.com/user", (user) => {console.log(`获取到用户: ${user.name}`);
});// 使用场景 2:只提取用户的 ID 列表
fetchData("https://api.example.com/users", (users) => {const ids = users.map(u => u.id);console.log("用户 ID 列表:", ids);
});

5. 函数柯里化(预设参数)

将一个多参数函数转换成一系列单参数函数,用来“固定”某些参数。

// 封装一个通用的日志打印器
const createLogger = (type) => (message) => {console.log(`[${type}] ${new Date().toLocaleTimeString()}: ${message}`);
};// 预设好“错误”类型的打印器
const logError = createLogger("错误");
const logInfo = createLogger("信息");logInfo("系统启动成功"); // 输出: [信息] 14:30:05: 系统启动成功
logError("数据库连接失败"); // 输出: [错误] 14:30:10: 数据库连接失败

6. 函数组合

将小函数组合成大函数,每个函数只负责一小块逻辑。

const addExclamation = (str) => `${str}!`;
const toUpper = (str) => str.toUpperCase();// 简单版本
const formatShout = (str) => addExclamation(toUpper(str));// 复杂版本
const compose = (...fns) => x => fns.reduceRight((v, f) => f(v), x);
const formatShout = compose(addExclamation, toUpper);console.log(formatShout("hello")); // HELLO!

http://www.jsqmd.com/news/503095/

相关文章:

  • GFXReconstruct完全解析:从结构到配置的实战指南
  • Linux系统调用无陷入实现-ARM64 5.15
  • Dify混合RAG召回率突破95%的最后临界点(仅限头部AIGC团队内部使用的动态分片+缓存穿透防护协议)
  • 贝叶斯优化LSTM在MATLAB中的时间序列单输入单输出预测模型(2021版)
  • ComfyUI可视化工作流:无缝集成OWL ADVENTURE进行复杂视觉任务编排
  • Alpamayo-R1-10B部署教程:20GB显存适配与WebUI免配置实操
  • 公司战略缺乏AI人才基础,与CAIE认证合作开展定制培训是否可行?
  • 毕业论文降AI率售后体验对比:比话/嘎嘎/率零谁更让人放心 - 我要发一区
  • Meta-Reinforcement Learning实战:如何用MAML让AI快速适应新游戏关卡?
  • 如何在 MySQL 中监控和优化慢 SQL?
  • Bidili Generator新手福利:免费商用SDXL工具,附赠提示词秘籍
  • 降AI率效果不达标,我是怎么拿到全额退款的(真实经历) - 我要发一区
  • 突破数据传输瓶颈:Apache Arrow IPC技术深度解析与实战
  • CMS / G1 / ZGC:收集器怎么选?它们分别怎么工作?
  • Chord视频分析新手入门:第一次使用如何上传视频并获取分析结果
  • 3分钟掌握GFXReconstruct:图形API捕获与重放实战指南
  • 解锁5大系统调优引擎:AtlasOS性能提升实战指南
  • 效率重构:PaperZZ AI 如何让本科论文从选题到成稿实现高效落地
  • Linux下HYM8563 RTC驱动加载失败的5种排查姿势(附i2c工具实战)
  • 突破视频资源获取瓶颈:VideoDownloadHelper的全场景解析与应用方案
  • Lumerical仿真报错全解析:从No physical modes到diverge的解决方案
  • Agent协同失效?Dify工作流卡顿、消息丢失、循环调用问题全解析,5类高频故障诊断清单速查
  • GitHub加速插件:提升国内开发者访问效率的解决方案
  • 海康SDK在Unity中的正确打开方式:从DllNotFound到完美运行的避坑指南
  • 微信小程序如何优雅引入Animate.css?最新4.0+版本避坑指南
  • GitHub加速插件技术解析:如何彻底解决国内开发者访问GitHub的速度瓶颈
  • 内存池重建技术:三维修复架构解决《恶霸鲁尼》Windows 10崩溃难题
  • 避开这5个坑!UE5 Python远程执行功能调试指南(含Multicast端口冲突解决方案)
  • Qwen2-VL-2B-Instruct辅助LaTeX写作:从图表生成描述文本
  • 高效掌握Ultima Online服务器搭建:从入门到实践