红宝书第九讲:JavaScript对象创建与属性描述符详解
资料取自《JavaScript高级程序设计(第5版)》。
查看总目录:红宝书学习大纲
一、对象创建的三种方式
JavaScript中创建对象主要有以下方式:
1. 对象字面量(直接创建)
直接在代码中写键值对:
let person = {
name: "Alice",
age: 25
};
2. 构造函数(new
关键字)1
通过构造函数创建对象实例:
function Person(name, age) {
this.name = name;
this.age = age;
}
let alice = new Person("Alice", 25);
3. 类声明(ES6语法)2
使用现代类语法创建对象:
class Person {
friendCount = 0; // 类字段直接初始化
constructor(name) {
this.name = name;
}
}
let bob = new Person("Bob");
// bob.friendCount默认为0
二、属性描述符:控制对象属性的“锁”
每个对象属性都有四个隐藏特性(数据描述符),可用 Object.defineProperty()
控制:3
特性名 | 作用 | 默认值 |
---|---|---|
[[Value]] | 属性的实际值 | undefined |
[[Writable]] | 是否允许修改值 | true |
[[Enumerable]] | 是否出现在for-in 循环中 | true |
[[Configurable]] | 是否允许删除或重新定义特性 | true |
示例:创建不可写属性
让age
属性不可修改:
let person = { name: "Alice" };
Object.defineProperty(person, "age", {
value: 25,
writable: false, // 禁止修改
enumerable: true, // 可被遍历
configurable: true // 允许后期重新定义
});
person.age = 30; // 修改无效(严格模式报错)
console.log(person.age); // 25
常见应用场景
隐藏内部属性
设置enumerable: false
,避免暴露内部逻辑:Object.defineProperty(object, "internalSecret", { value: "机密数据", enumerable: false // 不会被for-in遍历 });
保护关键属性
防止误删或覆盖:Object.defineProperty(object, "id", { value: 1001, configurable: false // 禁止删除或重定义 });
三、扩展:对象代理(Proxy)4
使用Proxy可以监听对象操作,例如拦截属性读取和设置:
const target = { id: 1001 };
const handler = {
get(target, property) {
return `读取属性值:${target[property]}`;
}
};
const proxy = new Proxy(target, handler);
console.log(proxy.id); // 输出:读取属性值:1001
目录:总目录
上篇文章:红宝书第八讲:箭头函数与高阶函数:厨房工具与智能菜谱的对比
下篇文章:红宝书第十讲:「构造函数与原型链」入门及深入解读:用举例子+图画理解“套娃继承”
脚注
- 构造函数通过
new
关键字创建对象实例。来源:《JavaScript高级程序设计(第5版)》 基础引用类型中的构造函数说明。 ↩ - 类字段允许直接声明属性并初始化。来源:《JavaScript高级程序设计(第5版)》 Class Field Declarations章节。 ↩
- 属性描述符包括[[Value]]、[[Writable]]、[[Enumerable]]、[[Configurable]],可通过
Object.defineProperty
配置。来源:《JavaScript高级程序设计(第5版)》 属性描述符定义的章节。 ↩ - Proxy对象用于创建目标对象的代理,监听操作。来源:《JavaScript高级程序设计(第5版)》 Passthrough Proxy的示例部分。 ↩
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。