JavaScript 对象深入
学习对象的创建、方法、属性遍历、this · 难度:进阶 · +15XP
JavaScript 对象深入详解
对象(Object)是 JavaScript 最核心的数据类型。除了原始类型(string, number, boolean, null, undefined, symbol, bigint)外,一切皆为对象。对象是键值对(key-value pair)的集合,键是字符串或 Symbol,值可以是任意数据类型。理解对象的创建、属性描述符、原型链、遍历方式等核心概念是掌握 JavaScript 的关键。
创建对象的方式
- 对象字面量:
{},最常用 - 构造函数:
new Object()或自定义构造函数 - Object.create():指定原型创建对象
- class 语法:ES6 类语法糖
// 1. 对象字面量
const user = {
name: "张三",
age: 25,
greet() { return "你好,我是" + this.name; }
};
// 2. 构造函数
function User(name, age) {
this.name = name;
this.age = age;
}
User.prototype.greet = function() {
return "你好,我是" + this.name;
};
const u1 = new User("李四", 30);
// 3. Object.create()
const proto = { type: "animal" };
const dog = Object.create(proto);
dog.name = "旺财";
// 4. class 语法
class Person {
constructor(name, age) {
this.name = name;
this.age = age;
}
greet() { return "你好,我是" + this.name; }
}
const p1 = new Person("王五", 28);
属性访问与操作
| 操作 | 语法 | 说明 |
|---|---|---|
| 点号访问 | obj.key | 简洁,但 key 必须是合法标识符 |
| 方括号访问 | obj["key"] | 支持动态 key 和特殊字符 |
| 属性存在检查 | "key" in obj | 包括原型链上的属性 |
| 自有属性检查 | obj.hasOwnProperty("key") | 不包括原型链 |
| 删除属性 | delete obj.key | 删除属性,可能影响性能 |
| 计算属性名 | { [expr]: val } | 动态属性名 |
const key = "favoriteColor";
const obj = {
name: "张三",
age: 25,
[key]: "蓝色", // 计算属性名
"complex-key": "特殊键名" // 包含特殊字符的键名
};
// 访问方式对比
console.log(obj.name); // "张三"
console.log(obj["age"]); // 25
console.log(obj[key]); // "蓝色"(动态 key)
console.log(obj["complex-key"]); // "特殊键名"
// 属性检查
console.log("name" in obj); // true
console.log(obj.hasOwnProperty("toString")); // false(在原型上)
// Object.defineProperty 定义精确控制的属性
Object.defineProperty(obj, "id", {
value: 12345,
writable: false, // 不可修改
enumerable: false, // 不可枚举
configurable: false // 不可删除/重新定义
});
对象遍历方法对比
const obj = { a: 1, b: 2, c: 3 };
// for...in:遍历自身及原型链上的可枚举属性
for (const key in obj) {
console.log(key, obj[key]);
}
// Object.keys():返回自身可枚举属性的键数组
Object.keys(obj).forEach(key => console.log(key, obj[key]));
// Object.values():返回自身可枚举属性的值数组
console.log(Object.values(obj)); // [1, 2, 3]
// Object.entries():返回 [key, value] 数组
for (const [key, value] of Object.entries(obj)) {
console.log(key + " = " + value);
}
// Object.getOwnPropertyNames():包括不可枚举属性(不含 Symbol)
// Object.getOwnPropertySymbols():获取 Symbol 属性
// Reflect.ownKeys():获取所有自身属性(包括 Symbol 和不可枚举)