### Object
1. 构造函数中的this如果返回对象类型数据,则this会发生改变,不再指向实例对象
### this指向
1. ES5 this的指向取决于函数的运行,this的绑定和函数声明的位置没有任何关系,取决于函数的调用方式
2. call,apply都是显示传入this需要绑定的对象,区别在于参数的传递
3. bind硬绑定this对象,返回绑定后的对象,需要再一次调用
### 函数的四种调用形式
1. new 构造函数调用(如果返回新对象,则this指向新创建的对象)
2. 显示绑定调用(call apply bind)
3. 对象方法调用
4. 直接调用
### 对象的拥有两种属性:数据属性和访问器属性
1. 数据属性只能通过ES5的 Object.defineProperty定义
2. 在严格模式下操作不可操作的属性都会报错
3. 获取描述对象:Object.getOwnPropertyDescriptor( obj, "year" )
```
Object.defineProperty(obj, 'name', {
configurable: true, //是否可以通过delete删除属性
enumerable: false, // 是否能通过for in循环返回属性
writable: false, //是否能修改属性值
value: 'jack' //属性值
})
```
3. 访问器属性设置属性set与get操作,如果只
```
Object.defineProperty(obj, 'year', {
get(value) {
return this.\_year
},
set(value) {
if (value \> 20) {
this.\_year \= ++value
}
},
enumerable: true,
configurable: true
})
```
4. IE9及以下的浏览器只能使用下列方法进行定义,没有实现defineProperty方法
```
obj.\_\_defineGetter\_\_('gender', function() {
return this.\_year
})
obj.\_\_defineSetter\_\_('gender', function(value) {
this.\_year \= value
})
```
5. 一次定义多个属性
```
Object.defineProperties(obj, {
like: {
value: 'runing'
},
object: {
value: 'xiameimei',
},
income: {
get() {
return 20
},
set(newval) {
}
}
})
```