JavaScript高级编程:面向对象设计与Object.defineProperty详解
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程序设计的关键。
2012-01-07 上传
2021-01-30 上传
点击了解资源详情
2022-08-19 上传
2016-06-06 上传
2014-12-29 上传
2015-11-21 上传
2020-10-30 上传
点击了解资源详情
只在当初微笑
- 粉丝: 275
- 资源: 866
最新资源
- 基于Python和Opencv的车牌识别系统实现
- 我的代码小部件库:统计、MySQL操作与树结构功能
- React初学者入门指南:快速构建并部署你的第一个应用
- Oddish:夜潜CSGO皮肤,智能爬虫技术解析
- 利用REST HaProxy实现haproxy.cfg配置的HTTP接口化
- LeetCode用例构造实践:CMake和GoogleTest的应用
- 快速搭建vulhub靶场:简化docker-compose与vulhub-master下载
- 天秤座术语表:glossariolibras项目安装与使用指南
- 从Vercel到Firebase的全栈Amazon克隆项目指南
- ANU PK大楼Studio 1的3D声效和Ambisonic技术体验
- C#实现的鼠标事件功能演示
- 掌握DP-10:LeetCode超级掉蛋与爆破气球
- C与SDL开发的游戏如何编译至WebAssembly平台
- CastorDOC开源应用程序:文档管理功能与Alfresco集成
- LeetCode用例构造与计算机科学基础:数据结构与设计模式
- 通过travis-nightly-builder实现自动化API与Rake任务构建