从"送花"讲懂 JavaScript:对象、数据类型与代理模式

一、一个会说话的代码小故事

想象这个场景:男生小志(代码里的 zzp)喜欢女生小美(xm),想送花表白。他兴冲冲把花捧到小美面前,可小美一看自己的"心动值"只有 30(满分 100),礼貌回了一句:"不约,我们不约。"小志很沮丧,于是改请小美的闺蜜小红(xh)帮忙。小红接过花,并没有急着转交,而是先跟小美聊了一会儿,把小美的心动值哄到了 90,再把花递过去。这一次,小美欣然收下,开心地喊出:"硕果走一波!!!"

这不是小说,而是一段真实的 JavaScript 代码(index.htmlreadme.md)。它看似轻松,背后却藏着一条通往"面向对象编程"和"设计模式"的完整路线。这篇文章就带你把它拆开,看懂其中的原理和逻辑。

二、对象字面量:JS 最有表现力的地方

传统上,像 Java、C++ 这样的语言,想创造一个"小美",得先定义一个类(class),把属性和方法都列好,再用类去"实例化"出对象。而早期的 JavaScript 连 class 关键字都没有,它选择了一条更直接的路线:直接写一对花括号 {},里面一行行写"键值对"(key: value),一个对象就诞生了。

比如代码里:

js 复制代码
let zzp = {
  name: '郑志鹏',
  age: 18,
  hobbies: ['学习', '运动', '打游戏'],
  sendFlower: function (target) { target.receiveFlower(zzp); }
};

这种写法叫"对象字面量 "。字面量的意思是:你写出来长什么样,对象就是什么样,所见即所得,不需要额外的"模板"。数组同理,一对方括号 [] 就是一个数组。正因如此,教程开头才说"JS 是最有表现力的脚本语言"。

对象由"属性"和"方法"构成:属性是描述它"是什么"的数据(nameage),方法是它"能做什么"的行为(sendFlowerreceiveFlower)。把数据和行为打包进同一个对象,这就是最朴素、也最本质的面向对象思想。

三、六种数据类型,和"弱类型"的真相

JavaScript 的数据类型一共六种:字符串 string、数值 number、布尔值 Boolean、空值 null、未定义 undefined、对象 object(数组、函数本质上都算 object)。

JS 是一门弱类型 语言:变量本身不绑定类型,类型完全由"赋给它的值"决定。代码里先 let a;a = 1;,此时 typeof a 就是 number;若把 a 改成字符串,它立刻变成 string。同一个盒子,装什么就"是"什么。这种灵活性是 JS 易上手的原因,但也意味着写代码时要自己小心别把类型用混了。

四、最容易混淆的一对:undefined 与 null

1.js 专门演示了这两个新人最容易搞混的值。记住一句话:undefined 是"没有值",null 是"值为空"

  • undefined :变量声明了但没赋值(let a;),JS 不知道该给什么,就自动塞一个 undefined。更常见的场景是访问对象里不存在的属性,比如 obj.girlFriend------对象里根本没这个属性,JS 不会报错,而是"体贴地"返回 undefined
  • null :是一个明确 的空值。代码里 let b = '原来的值'; b = null; 意思是:这个变量曾经有值,现在你主动把它清空了。它是"被赋上去"的一个值,而不是"没定义"。

一个代表"真空虚",一个代表"主动清空",语义完全不同。理解了这点,很多框架代码里的判断逻辑你就能看懂了。

五、代理模式:小红的"曲线救国"

回到故事。为什么小红一出手就能成?因为小美的收花逻辑是:心动值 xq 小于 80 就拒绝。小志直接送花,xq 只有 30,必然被拒。而小红没有改动小美一行代码 ------她自己写了一个 receiveFlower 方法,和小美的长得一模一样,这就是"实现了同一个接口"。

当小志把花送给小红时,小红先不急着转交,而是用 setTimeout 等上 3 秒,偷偷把小美的 xq 改成 90,然后再调用小美原本的 receiveFlower 方法。此刻小美心动值达标,欣然接受。

这个过程,正是设计模式里的代理模式(Proxy) :不直接访问目标对象,而是通过一个代理对象间接地访问。代理可以在幕后悄悄做很多事------延迟、加工、鉴权、改参数------而目标对象本身一行都不用改。这就是 readme.md 里"面向接口编程,代码就灵活且 powerful"的含义:只要送花者面对的对象都实现了 receiveFlower 这个接口,他根本不需要知道对面站的是小美还是小红。

相关推荐
渣波43 分钟前
NestJS 企业级后端架构实战:从核心代码到工程化思维的深度重构
前端·typescript·nestjs
BreezeJiang43 分钟前
别再背工厂模式了:NestJS 第一行代码就是它的工业级落地
前端·javascript
光影少年43 分钟前
RN 常见性能问题:JS卡顿、UI卡顿、桥接通信耗时
前端·react native·react.js
liuxiaocheng1 小时前
文本生成的进阶:generateText / streamText 里迟早会撞上的东西
前端·后端·ai编程
渣波1 小时前
深度解析工厂模式:从蜜雪冰城到 NestFactory,彻底搞懂“创建与使用分离”
前端·javascript
蔓越莓1 小时前
打包工具:编译器ESBuild
前端·面试
用户921080262861 小时前
Bubble 的 loading 和 typing:AI 回复生成中的交互处理
前端
SamChan901 小时前
用Playwright端到端测试PDF翻译功能:Web自动化测试实战
前端·python·ai·pdf·wpf
平生不晚1 小时前
在 SVG 体系里画一条任意的线
前端·算法