《JavaScript语言精粹》第3章:对象——JS世界的基石

📘 《JavaScript语言精粹》第3章:对象------JS世界的基石

在JavaScript中,对象是"一等公民"。理解对象,是理解整个语言的关键。


一、对象是什么?

在JavaScript中,对象是属性的容器

  • 每个属性都有名字 (可以是任意字符串,包括空字符串)和 (可以是任何类型,除了undefined
  • 对象是动态的,可以随时增删属性
  • 对象是无类别的(class-free) ,不需要类就能创建

javascript

ini 复制代码
let person = {
  name: "张三",
  age: 25
};

二、创建对象的方式

1. 对象字面量(最常用、最推荐)

javascript

csharp 复制代码
let empty = {};                     // 空对象
let point = { x: 10, y: 20 };      // 两个属性
let book = {
  title: "JavaScript精粹",
  author: "Crockford",
  "published-year": 2008            // 特殊字符需加引号
};

✅ 优点:简洁、清晰、无需new

2. 使用 Object.create

javascript

ini 复制代码
let parent = { name: "parent" };
let child = Object.create(parent);

✅ 原型继承的标准方式

3. 使用 new(不推荐)

javascript

ini 复制代码
let obj = new Object();

❌ 不推荐,容易出错且语义模糊


三、属性的操作

1. 检索属性

javascript

ini 复制代码
let flight = {
  airline: "Oceanic",
  number: 815
};

flight.airline;        // "Oceanic"
flight["number"];      // 815
flight.status;         // undefined(不存在的属性)

优先使用.表示法,更简洁

2. 更新或新增属性

javascript

ini 复制代码
flight.number = 816;          // 更新
flight.status = "overdue";    // 新增

3. 删除属性(delete

javascript

arduino 复制代码
delete flight.status;
  • 只删除对象自身的属性
  • 不会影响原型链上的同名属性

四、引用传递

对象是引用类型,不会被隐式复制:

javascript

ini 复制代码
let a = { value: 1 };
let b = a;
b.value = 2;

console.log(a.value); // 2

赋值、传参、比较都是基于引用


五、原型链(核心重点)

1. 什么是原型?

每个对象都连接到一个原型对象,可以从中继承属性。

  • 对象字面量默认连接:Object.prototype
  • 原型链检索:如果对象没有属性,就去原型上找

javascript

ini 复制代码
let parent = { name: "parent" };
let child = Object.create(parent);

console.log(child.name); // "parent"

2. 原型链的动态性

javascript

ini 复制代码
parent.greeting = "hello";
console.log(child.greeting); // "hello"

原型链只在检索 时起作用,更新时不影响原型

3. 自定义原型方法(beget)

javascript

javascript 复制代码
if (typeof Object.create !== 'function') {
  Object.create = function (o) {
    let F = function () {};
    F.prototype = o;
    return new F();
  };
}

六、反射与枚举

1. 检查属性是否存在

javascript

ruby 复制代码
typeof flight.number;            // "number"
flight.hasOwnProperty("number"); // true

2. 遍历属性(for...in

javascript

erlang 复制代码
for (let prop in obj) {
  if (obj.hasOwnProperty(prop)) {
    console.log(prop + ": " + obj[prop]);
  }
}

必须过滤原型链属性,推荐使用 hasOwnProperty

3. 确保顺序

javascript

ini 复制代码
let keys = ["name", "age", "city"];
for (let i = 0; i < keys.length; i++) {
  console.log(obj[keys[i]]);
}

七、减少全局污染

问题:全局变量是魔鬼

javascript

ini 复制代码
var name = "global"; // 全局污染

解决方案:唯一全局变量

javascript

ini 复制代码
let MYAPP = {};

MYAPP.person = {
  name: "张三",
  age: 25
};

MYAPP.utils = {
  log: function(msg) {
    console.log(msg);
  }
};

✅ 降低命名冲突 ✅ 提高可读性 ✅ 便于管理


八、代码示例:综合应用

javascript

ini 复制代码
// 1. 创建对象
let MYAPP = {};

MYAPP.flight = {
  airline: "Oceanic",
  number: 815,
  departure: {
    city: "Sydney",
    time: "2025-05-18 10:00"
  }
};

// 2. 原型继承
let flight2 = Object.create(MYAPP.flight);
flight2.number = 816;
flight2.arrival = { city: "LAX", time: "2025-05-18 22:00" };

// 3. 遍历属性
for (let prop in flight2) {
  if (flight2.hasOwnProperty(prop)) {
    console.log(prop + ": " + flight2[prop]);
  }
}

// 输出:
// number: 816
// arrival: [object Object]

九、本章小结

概念 说明
对象字面量 最推荐的创建方式
引用传递 对象赋值/比较基于引用
原型链 继承的核心机制
hasOwnProperty 避免原型链污染
唯一全局变量 避免污染的最佳实践
相关推荐
穗余43 分钟前
Typescript let和var区别
前端·javascript·typescript
晓得迷路了1 小时前
栗子前端技术周刊第 144 期 - Rspack 2.2、pnpm 12、Solid 2.0 RC...
前端·javascript·css
奈斯先生Vector1 小时前
从“能调用”到“可运营”:AI Agent 进入多模型时代后的架构升级
java·javascript·数据库·人工智能·算法·架构·aigc
এ慕ོ冬℘゜3 小时前
前端实战:jQuery实现动态表格渲染与状态切换功能
前端·javascript·jquery
zzzzzz3103 小时前
react-bits:把酷炫动效从“灵感截图”变成可复用的 React 组件
javascript·react.js·动效
海兰11 小时前
【应用】基于 Next.js 16 + Python mplfinance的金融K线图与技术指标可视化平台(三)
javascript·python·金融
小磊哥er12 小时前
深入解构Claude Code - 第 7 篇 · 连接外面的世界
javascript·ai编程
小磊哥er12 小时前
深入解构Claude Code - 第 6 篇 · 终端里的图形界面
javascript·ai编程
海兰13 小时前
【应用】基于 Next.js 16 + Python mplfinance的金融K线图与技术指标可视化平台(一)
javascript·python·金融
可乐鸡翅yeah_14 小时前
hls.js 内存泄漏实战排查,直播 M3U8 长时间播放异常定位方案
开发语言·javascript·python·django·ecmascript·m3u8·m3u8在线