JavaScript高级程序设计(4)
第8 章对象、类与面向对象编程
### 8.1 理解对象 ```javascript let person = new Object(); person.name = "Nicholas"; person.age = 29; person.job = "Software Engineer"; person.sayName = function() { console.log(this.name); }; ``` ##### 8.1.1 属性的类型 1. 数据属性。数据属性包含一个保存数据值的位置。值会从这个位置读取,也会写入到这个位置。数据属性有4个特性描述它们的行为。 - `[[Configurable]]`:表示属性是否可以通过 delete 删除并重新定义,是否可以修改它的特性,以及是否可以把它改为访问器属性。默认情况下,所有直接定义在对象上的属性的这个特性都是 true,如前面的例子所示。 - `[[Enumerable]]`:表示属性是否可以通过 for-in 循环返回。默认情况下,所有直接定义在对象上的属性的这个特性都是 true,如前面的例子所示。 - `[[Writable]]`:表示属性的值是否可以被修改。默认情况下,所有直接定义在对象上的属性的这个特性都是 true,如前面的例子所示。 - `[[Value]]`:包含属性实际的值。这就是前面提到的那个读取和写入属性值的位置。这个特性的默认值为 undefined。 2. 访问器属性。访问器属性不包含数据值。有 4 个特性描述它们的行为: - [[Configurable]]:表示属性是否可以通过 delete 删除并重新定义,是否可以修改它的特性,以及是否可以把它改为数据属性。默认情况下,所有直接定义在对象上的属性的这个特性都是 true。 - [[Enumerable]]:表示属性是否可以通过 for-in 循环返回。默认情况下,所有直接定义在对象上的属性的这个特性都是 true。 - [[Get]]:获取函数,在读取属性时调用。默认值为 undefined。 - [[Set]]:设置函数,在写入属性时调用。默认值为 undefined。 ##### 8.1.2 定义多个属性 - `Object.defineProperties()`:通过多个描述符一次性定义多个属性。它接收两个参数:要为之添加或修改属性的对象和另一个描述符对象,其属性与要添加或修改的属性一一对应。 ##### 8.1.3 读取属性的特性 - `Object.getOwnPropertyDescriptor()`:取得指定属性的属性描述符。这个方法接收两个参数:属性所在的对象和要取得其描述符的属性名。返回值是一个对象,对于访问器属性包含configurable、enumerable、get 和 set 属性,对于数据属性包含 configurable、enumerable、writable 和 value 属性。 ##### 8.1.4 合并对象 - `Object.assign()`:这个方法接收一个目标对象和一个或多个源对象作为参数,然后将每个源对象中可枚举(Object.propertyIsEnumerable()返回 true)和自有(Object.hasOwnProperty()返回 true)属性复制到目标对象。以字符串和符号为键的属性会被复制。 ```javascript //简单复制 dest = {}; src = { id: 'src' }; result = Object.assign(dest, src); // Object.assign 修改目标对象 // 也会返回修改后的目标对象 console.log(dest === result); // true console.log(dest !== src); // true console.log(result); // { id: src } console.log(dest); // { id: src } //多个源对象 dest = {}; result = Object.assign(dest, { a: 'foo' }, { b: 'bar' }); console.log(result); // { a: foo, b: bar } ``` ##### 8.1.5 对象标识及相等判定 - `Object.is()`:这个方法与===很像,必须接收两个参数: ```javascript console.log(Object.is(true, 1)); // false console.log(Object.is({}, {})); // false console.log(Object.is("2", 2)); // false // 正确的 0、-0、+0 相等/不等判定 console.log(Object.is(+0, -0)); // false console.log(Object.is(+0, 0)); // true console.log(Object.is(-0, 0)); // false // 正确的 NaN 相等判定 console.log(Object.is(NaN, NaN)); // true ``` ##### 8.1.6 增强的对象语法 ##### 8.1.7 对象解构 ### 8.2 创建对象 ##### 8.2.1 概述 ##### 8.2.2 工厂模式 ##### 8.2.3 构造函数模式 ##### 8.2.4 原型模式 ##### 8.2.5 对象迭代 ### 8.3 继承 ##### 8.3.1 原型链 ##### 8.3.2 盗用构造函数 ##### 8.3.3 组合继承 ##### 8.3.4 原型式继承 ##### 8.3.5 寄生式继承 ##### 8.3.6 寄生式组合继承 ### 8.4 类 ##### 8.4.1 类定义 ##### 8.4.2 类构造函数 ##### 8.4.3 实例、原型和类成员 ##### 8.4.4 继承
顶部
收展
底部
[TOC]
目录
第1章 JavaScript简介
第2章 在 HTML中使用JavaScript
第3章 语言基础(1)语法变量
第3章 语言基础(2)数据类型
第3章 语言基础(3)操作符
第3章 语言基础(4)语句
第4章 变量、作用域与内存
第5章 基本引用类型
第6章 集合引用类型
第7章 迭代器与生成器
第8 章对象、类与面向对象编程
第9章 代理与反射
第10章 函数
第11章 期约与异步函数
第12章 BOM
第13章 客户端检测
第14章 DOM
第15章 DOM 扩展
第16章 DOM2 和 DOM3
第17章 事件
第18章 动画与 Canvas 图形
第19章 表单脚本
第20章 JavaScript API
第21章 错误处理与调试
第22章 处理 XML
第23章 JSON
第24章 网络请求与远程资源
第25章 客户端存储
第26章 模块
第27章 工作者线程
第28章 最佳实践
相关推荐
WebSocket