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

6 阅读3分钟

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

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


一、对象是什么?

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

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

javascript

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

二、创建对象的方式

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

javascript

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

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

2. 使用 Object.create

javascript

let parent = { name: "parent" };
let child = Object.create(parent);

✅ 原型继承的标准方式

3. 使用 new(不推荐)

javascript

let obj = new Object();

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


三、属性的操作

1. 检索属性

javascript

let flight = {
  airline: "Oceanic",
  number: 815
};

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

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

2. 更新或新增属性

javascript

flight.number = 816;          // 更新
flight.status = "overdue";    // 新增

3. 删除属性(delete

javascript

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

四、引用传递

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

javascript

let a = { value: 1 };
let b = a;
b.value = 2;

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

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


五、原型链(核心重点)

1. 什么是原型?

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

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

javascript

let parent = { name: "parent" };
let child = Object.create(parent);

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

2. 原型链的动态性

javascript

parent.greeting = "hello";
console.log(child.greeting); // "hello"

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

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

javascript

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

六、反射与枚举

1. 检查属性是否存在

javascript

typeof flight.number;            // "number"
flight.hasOwnProperty("number"); // true

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

javascript

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

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

3. 确保顺序

javascript

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

七、减少全局污染

问题:全局变量是魔鬼

javascript

var name = "global"; // 全局污染

解决方案:唯一全局变量

javascript

let MYAPP = {};

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

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

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


八、代码示例:综合应用

javascript

// 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避免原型链污染
唯一全局变量避免污染的最佳实践