#第6章 对象
- <a href="#no1">6.1 创建对象</a>
- <a href="#no2">6.2 属性的查询和设置</a>
- <a href="#no3">6.3 删除属性</a>
- <a href="#no4">6.4 检测属性</a>
- <a href="#no5">6.5 枚举属性</a>
- <a href="#no6">6.6 属性`getter`和`setter`</a>
- <a href="#no7">6.7 属性的特性</a>
- <a href="#no8">6.8 对象的三个属性</a>
- <a href="#no9">6.9 序列化对象</a>
- <a href="#no10">6.10 对象方法</a>
> 除了字符串、数字、`true`、`false`、`null`和`undefined`之外,JS中的值都是对象。
**对象最常见的用法是创建(`create`)、设置(`set`)、查找(`query`)、删除(`delete`)、检测(`test`)和枚举(`enumerate`)它的属性。**
> 属性包括名字和值
> 1. 属性名可以包含空字符串在内的任意字符串,但对象中不能存在两个同名的属性。2. 值可以是任意JS值,或者可以是一个`getter`或`setter`函数。
- 内置对象(native object)是由ECMAScript规范定义的对象或类。例如:数组、函数、日期和正则表达式都是内置对象。
- 宿主对象(host object)是由JS解释器所嵌入的宿主环境定义的。客户端JS中表示网页结构的HTMLElement对象均是宿主对象。既然宿主环境定义的方法可以当成普通的JS函数对象,那么宿主对象也可以当成内置对象。
- 自定义对象(user-defined object)是由运行中的JS代码创建的对象。
- 自有属性(own property)是直接在对象中定义的属性。
- 继承属性(inherited property)是在对象的原型对象中定义的属性。
##<a name="no1">6.1 创建对象</a>
> 可以通过对象直接量、关键字`new`和`Object.create()`函数来创建对象。
###6.1.1 对象直接量
> 对象直接量是由若干名/值对组成的映射表,名/值对中间用冒号分隔,整改映射表用花括号括起来。
###6.1.2 通过new创建对象
> `new`运算符创建并初始化一个新对象。关键字`new`后跟随一个函数调用。这里的函数称作构造函数,构造函数用以初始化一个新创建的对象。
###6.1.3 原型
> 每一个JS对象(null除外)都从原型继承属性。
###6.1.4 Object create()
> 略
##<a name="no2">6.2 属性的查询和设置</a>
> 可以通过`.`或方括号`[]`运算符来获取属性的值。
###6.2.1 作为关联数组的对象
> 略
###6.2.2 继承
> 略
###6.2.3 属性访问错误
> 略
##<a name="no3">6.3 删除属性</a>
> `delete`运算符可以删除对象的属性。**`delete`只能删除自有属性,不能删除继承属性。**
##<a name="no4">6.4 检测属性</a>
> 可以通过`in`运算符、`hasOwnPreperty()`和`propertyIsEnumerable()`方法来检测属性。
- `in`运算符左侧是属性名(字符串),右侧是对象。如果对象的自由属性或继承属性中包含这个属性则返回`true`。
- 对象的`hasOwnPreperty()`方法用来检测给定的名字是否是对象的自有属性。对于继承属性将返回`false`。
- `propertyIsEnumerable()`只有检测到是自由属性且这个属性可枚举为`true`时它才返回`true`。
##<a name="no5">6.5 枚举属性</a>
> 略
##<a name="no6">6.6 属性`getter`和`setter`</a>
> 略
##<a name="no7">6.7 属性的特性</a>
> 数据属性的4个特性分别是它的值(`value`)、可写性(`writable`)、可枚举性(`enumerable`)和可配置性(`configurable`)。
##<a name="no8">6.8 对象的三个属性</a>
> 每个对象都有与之相关的原型(`prototype`)、类(`class`)和可扩展性(`extensible attribute`)。
###6.8.1 原型属性
> 对象的原型属性是用来继承属性的。
###6.8.2 类属性
> 对象的类属性是一个字符串,用以表示对象的类型信息。
###6.8.3 可扩展性
> 对象的可扩展性用以表示是否可以给对象添加新属性。所有内置对象和自定义对象都是显示可扩展的,宿主对象的可扩展性是由JS引擎定义的。
##<a name="no9">6.9 序列化对象</a>
> 对象序列化是指将对象的状态转换为字符串,也可将空字符串还原为对象。
**ECMAScript5提供了内置函数`JSON.stringify()`和`JSON.parse()`用来序列化和还原JS对象。**
##<a name="no10">6.10 对象方法</a>
###6.10.1 toString()方法
> 它将放回一个表示调用这个方法的对象只的字符串。
###6.10.2 toLocaleString()方法
> 这个方法返回一个表示这个对象的本地化字符串。
###6.10.3 toJSON()方法
> 返回值是序列化的结果。
###6.10.4 valueOf()方法
> `valueOf()`方法和`toString()`方法非常相似,但往往当JS需要将对象转换为某种原始值而非字符串的时候才会调用它,尤其是转换为数字的时候。具体到9.6.6章节讨论如果给自定义对象类型定义`valueOf()`方法。