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

跟着 MDN 学JavaScript day_24:JavaScript对象基础完全指南

引言:为什么需要对象

在JavaScript编程的世界里,对象是最核心的概念之一。当你开始构建稍微复杂的应用程序时,很快就会意识到,使用独立分散的变量来存储相关联的数据是多么笨拙和低效。

constpersonName="张三";constpersonAge=28;constpersonOccupation="工程师";

随着应用规模的增长,这些零散的变量不仅难以管理,还容易导致命名冲突和代码混乱。如果要表示多个人,情况会变得更加糟糕。

对象应运而生,它提供了一种优雅的方式,将相关的数据和功能组织在一起,形成一个逻辑上独立的单元:

constperson={name:"张三",age:28,occupation:"工程师"};

对象反映了我们对现实世界的自然认知方式——将一个人视为具有各种属性和行为的整体,而不是孤立的特征集合。


一、对象基础:什么是对象字面量

对象本质上是一个包含相关数据和方法的集合。在对象的语境中:数据项被称为属性,函数被称为方法

创建对象最简单直接的方式是使用对象字面量语法——通过手动编写对象的内容来创建对象。

1.1 空对象

constperson={};

虽然空对象本身做不了什么,但它标志着我们开始使用一种全新的数据组织方式。

1.2 完整的对象示例

constperson={name:["Bob","Smith"],age:32,bio:function(){console.log(`${this.name[0]}${this.name[1]}现在${this.age}岁了。`);},introduceSelf:function(){console.log(`你好!我是${this.name[0]}`);},};

1.3 ES6 方法简写

当对象的成员是函数时,可以省略冒号和function关键字:

constperson={name:["Bob","Smith"],age:32,bio(){console.log(`${this.name[0]}${this.name[1]}现在${this.age}岁了。`);},introduceSelf(){console.log(`你好!我是${this.name[0]}`);},};

1.4 访问对象成员

person.name;// ["Bob", "Smith"]person.name[0];// "Bob"person.age;// 32person.bio();// "Bob Smith 现在 32 岁了。"person.introduceSelf();// "你好!我是 Bob。"

对象字面量的典型使用场景:需要传输一系列结构化的相关数据项时(如向服务器发送请求),发送一个对象比分别发送多个独立数据项更有效率。


二、点表示法:访问对象属性的主要方式

点表示法是访问对象属性和方法最常用、最直观的方式。对象名充当命名空间的角色,为内部成员提供上下文:

person.age;// 访问属性person.bio();// 调用方法

2.1 链式访问(子命名空间)

当一个对象成员本身又是一个对象时,可以继续使用点表示法深入访问:

constperson={name:{first:"Bob",last:"Smith",},age:32,bio(){console.log(`${this.name.first}${this.name.last}现在${this.age}岁了。`);},introduceSelf(){console.log(`你好!我是${this.name.first}`);},};person.name.first;// "Bob"person.name.last;// "Smith"
层级访问路径结果
第一层person整个对象
第二层person.name{first: "Bob", last: "Smith"}
第三层person.name.first"Bob"

⚠️ 修改对象的内部结构时,所有引用该结构的代码都需要同步更新。例如:数组索引 → 嵌套对象属性名。


三、括号表示法:动态访问对象属性

括号表示法作为点表示法的替代方案,语法与数组访问相似:

person["age"];person["name"]["first"];

3.1 对象本质上是关联数组

数组类型键(Key)映射
普通数组数字索引0 → "hello"
对象字符串键"name" → "Bob"

3.2 括号表示法的独特优势:动态属性名

点表示法只接受字面量成员名,而括号表示法可以接受变量作为属性名:

constperson={name:["Bob","Smith"],age:32,};functionlogProperty(propertyName){console.log(person[propertyName]);}logProperty("name");// ["Bob", "Smith"]logProperty("age");// 32
方式适用场景
点表示法person.age属性名在编写代码时已知(大多数情况)
括号表示法person["age"]属性名保存在变量中,运行时动态确定

四、设置对象成员:不仅仅是更新

通过点表示法或括号表示法,不仅可以查询对象成员的值,还可以设置或更新它们。

4.1 更新已有属性

person.age=45;person["name"]["last"]="Cratchit";

4.2 动态创建新成员

即便某个属性在对象定义时不存在,也可以在程序运行中通过赋值添加:

person["eyes"]="hazel";person.farewell=function(){console.log("再见!");};person["eyes"];// "hazel"person.farewell();// "再见!"

4.3 括号表示法动态设置成员名

属性名本身也可以是变量,在运行时才确定:

constmyDataName="height";constmyDataValue="1.75m";person[myDataName]=myDataValue;person.height;// "1.75m"

实际应用:从输入框获取属性名和属性值,动态添加到对象中:

constmyDataName=nameInput.value;constmyDataValue=nameValue.value;person[myDataName]=myDataValue;// 点表示法无法实现!

五、"this"关键字:上下文引用的奥秘

在对象的方法定义中,this指向当前代码运行时所在的对象——即调用该方法的对象实例。

constperson={name:["Bob","Smith"],introduceSelf(){console.log(`你好!我是${this.name[0]}`);},};

5.1 this 的核心价值:代码复用

当只有一个对象时,this和直接使用对象名没有实质区别。但当存在多个对象时,this的优势就凸显出来:

constperson1={name:"Chris",introduceSelf(){console.log(`你好!我是${this.name}`);},};constperson2={name:"Deepti",introduceSelf(){console.log(`你好!我是${this.name}`);},};person1.introduceSelf();// "你好!我是 Chris。"person2.introduceSelf();// "你好!我是 Deepti。"
使用对象名引用(❌ 不灵活): person1.introduceSelf() → console.log(`你好!我是 ${person1.name}。`) person2.introduceSelf() → console.log(`你好!我是 ${person2.name}。`) → 方法定义不同,无法复用 使用 this 引用(✅ 灵活): person1.introduceSelf() → this = person1 → this.name = "Chris" person2.introduceSelf() → this = person2 → this.name = "Deepti" → 方法定义完全相同,this 自动适配调用者

this让同样的方法代码对不同对象产生不同输出,实现了代码复用和行为的多态


六、构造函数:批量创建对象的工厂

6.1 对象字面量的局限

当需要创建多个结构相同的对象时,对象字面量需要重复编写大量相同代码:

// 重复劳动,低效且容易出错constsalva={name:"Salva",introduceSelf(){...}};constfrankie={name:"Frankie",introduceSelf(){...}};constchris={name:"Chris",introduceSelf(){...}};

6.2 工厂函数(过渡方案)

functioncreatePerson(name){constobj={};obj.name=name;obj.introduceSelf=function(){console.log(`你好!我是${this.name}`);};returnobj;}constsalva=createPerson("Salva");constfrankie=createPerson("Frankie");salva.introduceSelf();// "你好!我是 Salva。"frankie.introduceSelf();// "你好!我是 Frankie。"

6.3 构造函数(标准做法)

构造函数与普通函数的区别在于使用new关键字调用。按照惯例,构造函数以大写字母开头

functionPerson(name){this.name=name;this.introduceSelf=function(){console.log(`你好!我是${this.name}`);};}// 使用 new 关键字调用constsalva=newPerson("Salva");constfrankie=newPerson("Frankie");salva.introduceSelf();// "你好!我是 Salva。"frankie.introduceSelf();// "你好!我是 Frankie。"

6.4 new 关键字自动完成的四个步骤

① 创建一个空对象 → {} ② 将 this 绑定到新对象 → this = {} ③ 运行构造函数中的代码 → this.name = "Salva"; ... ④ 返回新对象 → return this(自动完成)

6.5 三种创建方式对比

方式语法适用场景代码复用
对象字面量const obj = { ... }单个对象、传输数据❌ 无法复用
工厂函数function create() { return {...} }少量相似对象⚠️ 较冗长
构造函数new Person()批量创建同类型对象✅ 标准做法

七、你一直在使用对象:无处不在的内置对象

回顾之前学过的JavaScript知识,许多熟悉的功能实际上都是通过对象来实现的。

7.1 String 对象

constmyString="Hello,World";myString.split(",");// ["Hello", "World"]

每次创建字符串时,该字符串都会被自动创建为String的实例,因此可以访问原型上的split()toUpperCase()trim()等方法。

7.2 Document 对象(DOM)

constmyDiv=document.createElement("div");constmyVideo=document.querySelector("video");

页面加载完毕后,Document的实例document被创建,代表整个页面的结构、内容和功能。

7.3 Array 对象

constarr=[1,2,3];arr.push(4);// Array 实例的方法arr.map(x=>x*2);// 同上

7.4 Math 对象

Math.PI;// 3.14159...(静态属性)Math.random();// 随机数(静态方法)

Math是内置对象,不需要实例化即可直接使用。

7.5 需要手动实例化的 API

constmyNotification=newNotification("你好!");

不同API的设计思想不同,但底层原理相通:它们都是基于JavaScript的对象系统构建的。


总结

知识点核心内容
对象字面量{ key: value }创建单个对象,适合传输结构化数据
点表示法person.age,属性名已知时使用
括号表示法person["age"],属性名为变量时使用
动态设置成员person[varName] = value,属性名运行时确定
this关键字指向调用方法的对象实例,实现代码复用和多态
构造函数new Person()批量创建同类型对象
内置对象StringArrayDocumentMath等都是对象

对象的核心价值:将相关的属性和方法封装在一起,形成逻辑上独立的单元。对象使我们将信息安全地锁在它们自己的包内,防止命名冲突和数据混乱。

在掌握了对象基础之后,下一步将探索JavaScript更具特色的概念——原型。原型是JavaScript实现对象继承的基本方式,让对象能够从其他对象继承属性和方法,进一步扩展代码复用的可能性。


还在为 JavaScript 代码写得像“意大利面条”、逻辑混乱难以维护而头秃?收藏本文持续跟进,后续将系统分享 JS 高效语法糖、浏览器兼容与 Polyfill 实战、手写核心源码解析、常见坑点避雷指南,从基础语法到进阶逻辑一站式打通,助你快速提升前端开发硬实力!

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

相关文章:

  • 数据入队模块的-ExeModule
  • 5个步骤掌握LaserGRBL:免费开源激光雕刻控制软件终极指南
  • 2026年太原刑事辩护律师推荐怎么选?看这五点关键不踩雷(蓝色河畔推荐) - 本地品牌推荐
  • <p>抚顺的街头巷尾,贵金属回收店铺星罗棋布,从黄金、白银到铂金,各类回收需求日益旺盛。为了帮大家拨云见日,找到真正靠谱的服务商,小编不辞辛劳,精心梳理了一份关于抚顺本地诚信回收店铺的参考指南。以下便
  • Harness 中的会话压缩归档与懒加载
  • 联合嵌入预测架构与拟度量强化学习的能量理论统一
  • 2026年钛板选购指南:专业钛材公司哪家可靠?中国钛谷企业实力评测与行业趋势解读 - 优质品牌商家
  • UIDesign完整解析
  • 作者归属技术与隐私保护:从特征分析到k-匿名实践
  • Java毕设选题推荐:基于 Java 的学生活动报名管理系统的设计与实现【附源码、mysql、文档、调试+代码讲解+全bao等】
  • 进化算法讲义:遗传编程、进化编程与差分进化
  • 2026年质量好的山西断桥铝门窗/山西合金断桥铝门窗/山西极窄断桥铝门窗/山西高端断桥铝门窗源头工厂推荐 - 品牌宣传支持者
  • MMD Tools终极指南:在Blender中完美融合MMD工作流
  • 2026年推板机厂家:株洲圆棒推板机/实心料推板机/CNC多工位联动推板送料机专业品牌解析 - 品牌发掘
  • 别再乱接A和B了!手把手教你用MAX485芯片搭建一个稳定可靠的TTL转485模块(附完整电路图)
  • 2026年酒店咖啡机设备厂商深度评测:谁在定义商用场景的新标准? - 优质品牌商家
  • 基于西门子plc的高炉运矿皮带拣铁装置的控制系统设计31(设计源文件+万字报告+讲解)(支持资料、图片参考_相关定制)_可以扫码
  • paperxie 论文格式不用死磕 Word,四千院校模板一键标准化排版
  • 2026年防爆控制柜品牌选择指南:专业能力与市场格局深度分析 - 优质品牌商家
  • 2026佛山市权威认证贵金属回收 TOP5+黄金回收白银回收铂金回收门店地址电话推荐
  • 2026年声光报警器品牌厂家哪家靠谱?深度评测行业格局与技术趋势 - 优质品牌商家
  • 微信聊天记录导出完整指南:3步备份你的珍贵数字记忆 [特殊字符]️
  • 2026年比较好的陕西节能系统门窗/系统门窗定制/封阳台系统门窗/断桥铝系统门窗实力工厂推荐 - 品牌宣传支持者
  • 机器学习在拓扑分类中的捷径学习现象解析
  • SAP COOIS/COOISPI报表选择条件自定义实战:从界面增强到取数逻辑的完整配置流程
  • 2026年知名的断桥铝门窗/山西断桥铝门窗/定制断桥铝门窗稳定供货厂家推荐 - 行业平台推荐
  • 黄金比例与神经认知系统的信息平衡机制
  • 密钥池托管技术:底层 API Key 全加密存储,业务方看不到原生密钥
  • 2026年6月当下评价高的栏杆批发厂家推荐,景区石凉亭/庭院石凉亭/荔枝面青石板/石雕牌楼/石材护栏,栏杆门店选哪家 - 品牌推荐师
  • Android进程永生终极方案:基于Linux内核的黑科技保活技术突破