大家好,我是小彭!今天我要用一个生动有趣的JS代码案例,带大家深入理解JavaScript的弱类型、动态特性和面向对象思想,顺便分享一个"程序员式"的追女生方案(笑)。
一、JavaScript语言特性快速回顾
1. JS是种怎样的语言?
- **弱类型**:变量的类型由值决定,无需显式声明
- **动态**:运行时可以动态添加属性和方法
- **灵活**:对象字面量`{}`快速创建对象,数组字面量`[]`创建数组
- **脚本语言**:无需编译,直接解释执行
2. JS如何运行?
- **后端运行**:通过Node.js执行(如`node 1.js`)
- **前端运行**:
- 通过HTML文档引入:
```html
<!DOCTYPE html>
<html>
<script src="1.js"></script>
</html>
```
- 通过HTTP协议远程加载
二、面向对象编程初体验
1. 从现实世界到代码世界
面向对象编程(OOP)的核心是将现实世界的事物和关系抽象为软件对象。在我们这个例子中:
- 小彭 →
xp对象 - 小美 →
xm对象 - 小红 →
xh对象 - 送花行为 →
sendFlower方法
2. 对象的基本组成
每个对象都有:
- **属性**:描述对象的特征(如名字、年龄)
- **方法**:对象能够执行的动作(如送花、收花)
三、代码逐行解析(加强版)
1. 创建"小彭"对象
javascript
const xp = {
name: '小彭', // 字符串类型属性
age: 21, // 数值类型属性
hometown: '新余', // 来自江西新余
isSingle: true, // 布尔值 - 目前单身!
// 方法:送花功能
sendFlower: function(girl) { // 接收一个"女生"对象
console.log(`${this.name}给${girl.name}送了99朵玫瑰`);
girl.receiveFlower(this); // 调用女生的收花方法
}
};
关键点说明:
- 使用
const声明常量对象(防止被意外修改) - 对象字面量
{}快速创建对象 - 方法中使用
this关键字引用当前对象 - 模板字符串
`使拼接更优雅
2. 创建"小美"对象
javascript
const xm = {
xq: 30, // 心情值初始30分(满分100)
name: '小美',
room: '408', // 宿舍号
receiveFlower: function(sender) {
console.log(`${this.name}收到了${sender.name}送的99朵玫瑰`);
// 根据心情决定反应
if(this.xq > 90) {
console.log('硕果走起 🍎'); // 答应约会
} else {
console.log('gun———— 😠'); // 拒绝
}
}
};
行为分析:
- 当小美心情值
xq>90时:愉快接受 - 否则:直接拒绝(真实!)
3. 第一次尝试:直接送花
javascript
xp.sendFlower(xm);
输出结果:
小彭给小美送了99朵玫瑰
小美收到了小彭送的99朵玫瑰
gun———— 😠
问题分析:
- 小美心情值只有30,直接送花必然被拒
- 需要想办法提升小美的心情值
四、设计模式拯救计划:代理模式
1. 引入代理对象"小红"
javascript
const xh = {
name: '小红',
hometown: '新余', // 和小彭是老乡
room: '408', // 和小美同宿舍
receiveFlower: function(sender) {
console.log(`${this.name}先代收花朵...`);
// 关键代码:异步提升小美心情
setTimeout(() => {
console.log('小红正在给小美讲笑话...');
xm.xq = 99; // 把心情值提升到99
console.log('小红转交花朵给小美');
xm.receiveFlower(sender); // 实际调用小美的收花方法
}, 3000); // 3秒延迟模拟"做思想工作"时间
}
};
2. 代理模式的优势
- 接口一致性:小红和小美都有
receiveFlower方法 - 控制访问:可以在访问真实对象前进行预处理
- 延迟加载:使用
setTimeout模拟先培养感情 - 职责分离:送花逻辑和心情管理分离
3. 通过代理送花
javascript
xp.sendFlower(xh); // 这次送给小红
执行流程:
-
小彭调用
sendFlower,但传给小红 -
小红收到花后:
- 先不立即转交
- 用3秒时间提升小美心情(设
xq=99) - 然后再转交花朵
-
小美收到花时心情值已提升,愉快接受
最终输出:
小彭给小红送了99朵玫瑰
小红先代收花朵...
(3秒后)
小红正在给小美讲笑话...
小红转交花朵给小美
小美收到了小彭送的99朵玫瑰
硕果走起 🍎
五、技术深度解析
1. 为什么这是代理模式?
| 模式要素 | 对应代码实现 |
|---|---|
| 真实主题 | xm对象 |
| 代理主题 | xh对象 |
| 统一接口 | receiveFlower方法 |
| 访问控制 | 在转交前修改xm.xq属性 |
2. 前端中的代理模式应用
- 图片懒加载:先用占位图代理,真实图片加载完成后再替换
- API缓存:代理层先检查缓存,没有再请求后端
- 权限控制:代理验证权限后再访问真实功能
3. 面向对象设计原则体现
- 单一职责原则:小红负责心情管理,小美负责收花决定
- 开放封闭原则:新增代理不影响原有逻辑
- 接口隔离原则:通过统一接口交互
六、程序员恋爱进阶指南
- 不要直接访问:像直接操作DOM一样危险 ❌
- 善用中间件:像Express中间件一样层层处理 ✅
- 注意性能优化:像防抖一样避免"高频示爱" ⏱️
- 做好异常处理:准备好
try-catch应对拒绝 🛡️
八、总结
通过这个有趣的例子,我们学习了:
- JavaScript面向对象的基本用法
- 代理模式的实际应用场景
- 如何用设计模式思想解决实际问题
- 程序员特有的"浪漫"表达方式(笑)