### 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) {
}
}
})
```