## JS对象
- 对象是一种复合数据类型
- 它里面可以装任意数据类型的属性
#### 对象的分类
1. 内建对象
- 内建对象指由ES标准定义的对象,任何对ES标准的实现都可以使用这些对象
- 比如: Math String Numer Boolean RegExp
2. 宿主对象
- 宿主对象指由JS运行环境为我们提供的对象.目前来说就是指浏览器为我们提供的对象
- 比如: BOM对象 DOM对象
- window document console
3. 自定义对象
#### 对象的操作
- 创建一个对象
- 使用 new 关键字调用的函数称之为构造函数
- var 对象 = new Object( );
- var 对象 = {}
- 添加属性
- 对象.属性名=属性值
- 读取属性
- 对象.属性名
- 修改属性
- 对象.属性名=新属性值
- 删除属性
- delete 对象.属性
- 检查对象是否含有某个属性
- 使用 in 运算符. 如果有则返回true
- "属性名" in 对象
#### 常用添加对象方式
- 每一组名值对用逗号隔开.
- 最后一个属性值后面不要加逗号
- 语法: var obj = {属性名:属性值,属性名:属性值,属性名:属性值}
#### 对象的属性名和属性值
#####属性名
- 对象的属性名没有任何要求.也不需要遵循标识符的规范
- 可以起任何稀奇古怪的名字
- 但在开发中请遵循标识符规范
##### 属性值
- 属性值可以是任意数据类型
- 也可以是一个 Object
- 添加属性的第一种方式
- 对象.属性名=属性值
- 添加属性的第二种方式
- 对象["属性名"]=属性值
- 这种方式的[]里可以传任何稀奇古怪的属性名
#### 对象属性的枚举(遍历)
- 使用for..in语句对一个对象中的属性进行枚举
- 语法: ````for ( 任一变量 in 对象 ){ };````
- 对象中有几个属性,循环体就会执行几次
- 每次执行时,都会将一个对象中的属性名赋值给变量
#### 基本数据类型和对象的区别
- 程序在运行时,内存分为两种结构
- 栈内存
- 堆内存
- 基本数据类型的值,是直接保存到栈内存中的
- 基本数据类型的值,都是互相独立的,修改一个不会影响到其他的变量
- 对象是保存在堆内存中的
- 而在变量中保存的是对象的引用(堆内存的地址)
- 我们是通过引用来操作对象的,当修改一个对象时有可能会影响其他的对象
**对两个基本数据类型做相等比较时,比较的是数据的值**
**而两个引用数据类型做相等比较时,比较的是对象的地址**
**如果两个对象一模一样但地址值不同也会返回false**
#### 垃圾回收 (GC)
- 在JS中有自动的垃圾回收机制.浏览器会自动将没有被引用的对象清除出内存
- 回收的工作由浏览器自动完成.而我们只需要将一些不再使用的对象设置为null即可
#### 对象的原型
1. 对象的原型可以再创建一个对象
2. 通过对象创建会在原本的对象原型里创建出新的对象
3. 而原型通过属性直接创建是在原来函数里
![](http://i.imgur.com/wZYvDEP.png)
#### 对象的继承
1. 父构造函数定义一个对象
2. 子构造函数也定义一个对象
3. 子的构造函数的原型等于父构造函数的对象
4. 则子和父有了继承的关系
5. 即便子构造函数中没有父的内容,通过调用父函数的内容一样可以得到结果