## 對象概述
面向對象(Object-Oriented,OO)的語言有一個標志,那就是它們都有類的概念,而通過類可以創建任意多個具有相同屬性和方法的對象。但是,ECMAScript中并沒有類的概念,所以它的對象也有有所不同。
ECMAScript對象是一個無序屬性的集合,其屬性可以包含基本值、對象或函數。
對象的每個屬性或方法都有一個名字,而每個名字都映射到一個值。
每個對象都是基于一個引用類型創建的。
**1、對象**
**1.1 創建對象**
(1)創建自定義對象的最簡單方式就是創建一個Object的實例,然后給其添加屬性和方法:
```
var person = new Object();
person.name = 'tg';
person.age = 10;
person.say = function(){
console.log(this.name);
}
```
上面的例子創建了一個名為person的對象,并為它添加了兩個屬性(name、age)和一個方法(say())。
(2)對象字面量
```
var person = {
name: 'tg',
age: 10,
say: function(){
console.log(this.name);
}
}
```
這個person對象和上面例子是等價的。
**1.2 屬性類型**
ECMA-262第5版在定義只有內部才用的特性(attribute)時,描述了屬性(property)的各種特征。ECMA-262定義這些特性是為了實現JavaScript引擎用的,因此在JavaScript中不能直接訪問它們。該規范將它們放在了兩對方括號中,表示特性是內部值,如[[Enumerable]]。
ECMAScript中有兩種屬性:數據屬性和訪問權屬性
**1.2.1 數據屬性**
數據屬性包含一個數據值的位置,在這個位置可以讀取和寫入值。
數據屬性有4個描述特性:
- [[Configurable]]:表示能否通過delete刪除屬性從而重新定義屬性,能否修改屬性的特性,或者能否把屬性修改為訪問器屬性。比如直接在對象上定義的屬性,它們的這個特性默認值為true。
- [[Enumerable]]:表示能否通過for-in循環返回屬性。對于直接在對象上定義的值,默認為true。
- [[Writable]]:表示能否修改屬性的值。
- [[Value]]: 包含這個屬性的數據值。讀取屬性值時,從這個位置讀;寫入屬性值時,把新值保存在這個位置。默認值為undefined。
要修改屬性默認的特性,必須使用ECMAScript 5的`Object.defineProperty()`方法,這個方法接收三個參數:屬性所在的對象、屬性的名字和一個描述符對象。其中,描述符對象的屬性必須是:configurable、enumerable、writable和value。
```
var person = {};
Object.defineProperty(person, 'name', {
writable: false,
value: 'tg'
});
console.log(person.name); // "tg"
person.name = 'tg2';
console.log(person.name); // "tg"
```
在上面的例子中,我們將person對象中的名為name的屬性的`writable`設置為false,也就是不可修改,所以即使后面執行了person.name='tg2',最后person對象的name值依舊是原始值。
注意:在嚴格模式下,如果對一個不可修改的屬性執行賦值操作,會拋出錯誤;非嚴格模式下則忽略賦值操作。
一旦將configurable特性設置為false后,就不能再把它變回可配置的了,如果再修改除writable之外的特性,都會導致錯誤。
**1.2.2 訪問器屬性**
訪問器屬性不包含數據值,它們包含一對getter和setter函數(非必需)。在讀取訪問器屬性時,會調用getter函數,返回有效的值;在寫入訪問器屬性時,會調用setter函數并傳入新值,它負責決定如何處理數據。
訪問器屬性:
- [[Configurable]]:表示能否通過delete刪除屬性從而重新定義屬性,能否修改屬性的特性,或者能否把屬性修改為訪問器屬性。比如直接在對象上定義的屬性,它們的這個特性默認值為true。
- [[Enumerable]]:表示能否通過for-in循環返回屬性。對于直接在對象上定義的值,默認為true。
- [[Get]]:在讀取屬性時調用的函數,默認為undefined
- [[Set]]:在寫入屬性時調用的函數,默認為undefined
訪問器屬性不能直接定義,也是要使用`Object.defineProperty()`方法來定義。
```
var person = {
_age: 20,
intro: ''
};
Object.defineProperty(person, 'age', {
get: function() {
return this._age;
},
set: function(newValue){
if(newValue < 18) {
this.intro = '裝嫩';
this._age = newValue;
}
}
});
console.log(person.age); // 20
person.age = 17;
console.log(person.intro); // "裝嫩"
```
在上面的例子中,訪問器屬性age有一個getter函數和一個setter函數。getter函數返回`_age`的值,setter函數通過判斷`age`的設置值來改變其他屬性值。
**1.2.3 定義多個屬性**
ECMAScript 5提供的`Object.defineProperties()`方法可以通過描述符一次定義多個屬性,這個方法接收兩個對象參數,第一個對象是要添加和修改其屬性的對象,第二個對象的屬性與第一個對象要添加或修改的屬性一一對應。
```
var person = {};
Object.defineProperties(person, {
_age: {
value: 20
},
intro: {
value: ''
},
age: {
get: function(){
return this._age;
},
set: function(newValue){
if(newValue < 18) {
this.intro = '裝嫩';
this._age = newValue;
}
}
}
});
```
**1.2.4 讀取屬性的特性**
ECMAScript 5提供的`Object.getOwnPropertyDescriptor()`方法可以取得給定屬性的描述符,它接受兩個參數:屬性所在的對象和要讀取其描述符的屬性名稱,返回來的是一個對象,如果是訪問器屬性,這個對象的屬性有configurable、enumerable、get和set;如果是數據屬性,這個對象的屬性有configurable、enumerable、writable和value。
```
var person = {
_age: 20,
intro: ''
};
Object.defineProperty(person, 'age', {
get: function() {
return this._age;
},
set: function(newValue){
if(newValue < 18) {
this.intro = '裝嫩';
this._age = newValue;
}
}
});
var descriptor = Object.getOwnPropertyDescriptor(person,'age');
console.log(descriptor.enumerable); // false
console.log(typeof descriptor.get); // "function"
```
在JavaScript中,可以針對任何對象--包括DOM和BOM對象,使用`Object.getOwnPropertyDescriptor()`方法。
- 前言
- JavaScript簡介
- 基本概念
- 語法
- 數據類型
- 運算符
- 表達式
- 語句
- 對象
- 數組
- 函數
- 引用類型(對象)
- Object對象
- Array對象
- Date對象
- RegExp對象
- 基本包裝類型(Boolean、Number、String)
- 單體內置對象(Global、Math)
- console對象
- DOM
- DOM-屬性和CSS
- BOM
- Event 事件
- 正則表達式
- JSON
- AJAX
- 表單和富文本編輯器
- 表單
- 富文本編輯器
- canvas
- 離線應用
- 客戶端存儲(Cookie、Storage、IndexedDB)
- HTML5 API
- Video/Audio
- Geolocation API
- requestAnimationFrame
- File API
- FullScreen API
- IndexedDB
- 檢測設備方向
- Blob
- vibrate
- Luminosity API
- WebRTC
- Page Visibility API
- Performance API
- Web Speech
- Notification
- 面向對象的程序設計
- 概述
- this關鍵字
- 原型鏈
- 作用域
- 常用API合集
- SVG
- 錯誤處理機制
- JavaScript開發技巧合集
- 編程風格
- 垃圾回收機制