红宝书第九讲: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

常见应用场景
  1. 隐藏内部属性
    设置enumerable: false,避免暴露内部逻辑:

    Object.defineProperty(object, "internalSecret", {
      value: "机密数据",
      enumerable: false  // 不会被for-in遍历
    });
  2. 保护关键属性
    防止误删或覆盖:

    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

目录:总目录
上篇文章:红宝书第八讲:箭头函数与高阶函数:厨房工具与智能菜谱的对比

下篇文章:红宝书第十讲:「构造函数与原型链」入门及深入解读:用举例子+图画理解“套娃继承”

脚注


  1. 构造函数通过new关键字创建对象实例。来源:《JavaScript高级程序设计(第5版)》 基础引用类型中的构造函数说明。
  2. 类字段允许直接声明属性并初始化。来源:《JavaScript高级程序设计(第5版)》 Class Field Declarations章节。
  3. 属性描述符包括[[Value]]、[[Writable]]、[[Enumerable]]、[[Configurable]],可通过Object.defineProperty配置。来源:《JavaScript高级程序设计(第5版)》 属性描述符定义的章节。
  4. Proxy对象用于创建目标对象的代理,监听操作。来源:《JavaScript高级程序设计(第5版)》 Passthrough Proxy的示例部分。

kovli
7 声望4 粉丝