JavaScript高级编程:面向对象设计与Object.defineProperty详解

1 下载量 56 浏览量 更新于2024-08-28 收藏 80KB PDF 举报
在《JavaScript高级程序设计(第三版)》的学习笔记中,第6章深入探讨了面向对象编程中的核心概念——对象。对象是程序设计的基础,它将数据和行为封装在一起,是实现复杂逻辑的关键。本章节着重介绍了两种类型的属性:数据属性和访问器属性。 **1. 数据属性:** 数据属性是对象中常见的属性类型,它们具有以下特性: - **configurable(可配置性)**:默认为true,允许开发者通过`Object.defineProperty()`方法修改或删除属性的可配置性,包括修改其特性或者将其转换为访问器属性。 - **enumerable(可枚举性)**:默认为true,决定属性是否在`for-in`循环中可见,用于遍历对象的属性。 - **writable(可写性)**:默认为true,表示属性值是否可以被修改。 - **value(值)**:数据存储的位置,初始值为undefined。 通过`Object.defineProperty()`函数可以动态定义这些属性,例如: ```javascript var obj = {}; Object.defineProperty(obj, "name", { writable: true, value: "nihao" }); ``` 这段代码定义了一个名为"name"的数据属性,允许值被修改。 **2. 访问器属性:** 访问器属性提供了一种更灵活的方式,用于控制属性的读取和写入行为。它们没有`value`,而是由`get`和`set`方法定义: - `get`:读取属性时调用,如果没有显式设置,将返回`undefined`。 - `set`:写入属性时调用,可以执行自定义逻辑,如验证新值。 示例: ```javascript var obj = { _year: 2004, edition: 1 }; Object.defineProperty(obj, "year", { get: function() { return this._year; }, set: function(newValue) { if (newValue > 2004) { this._year = newValue; this.edition += newValue - 2004; } } }); obj.year = 2005; // 设置年份后,edition自动更新 alert(book.edition); // 输出2 ``` **3. 定义多个属性:** 对于需要同时定义多个属性的情况,可以使用`Object.defineProperties()`方法,它接收两个参数:目标对象和一个包含属性及其描述符的对象映射。这个方法支持的浏览器范围更广泛,如IE9及以上版本。 **4. 读取属性:** 获取对象自身的属性(不包括原型链上的属性)可以通过`Object.getOwnProperty`,但现代JavaScript推荐使用`Object.getOwnPropertyDescriptor()`或`Object.getOwnPropertyNames()`等方法。 第6章详细讲解了JavaScript中对象的属性管理,包括数据属性和访问器属性的定义、操作,以及如何利用`Object.defineProperty()`和`Object.defineProperties()`来控制属性的行为。理解这些概念是实现高效、灵活的JavaScript程序设计的关键。