JavaScript 深入瞭解物件中的屬性
JavaScript 深入瞭解物件中的屬性
本篇主要介紹JS中物件的屬性,包括:屬性的分類、訪問方式、檢測屬性、遍歷屬性以及屬性特性等內容。
目錄
1. 介紹:描述屬性的命名方式、查詢路徑以及分類
2. 屬性的訪問方式:介紹'.'訪問方式、'[ ]'中括號訪問方式
3. 刪除屬性:通過delete關鍵字刪除物件的某個屬性
4. 檢測屬性:介紹三種判斷某個屬性是否為物件的例項屬性:in、obj.hasOwnProperty、obj.propertyIsEnumerable
5.
6. 屬性特性:在Escript5中,增加了屬性特性這一內容,可設定屬性是否可列舉、可修改等特性
1. 介紹
1.1 描述
屬性,特指物件的成員,不單單為'屬性'(欄位),也包含了方法。
1.2 命名方式
屬性名稱可以包含英文字元、數字(不能開頭)、特殊符號(如:-、_、$等等)。
但一般使用純英文字元,在特殊情況下會新增-(橫槓:-webkit-、-moz- )以及 _(下劃線)。
若屬性名稱包含了-(橫槓),屬性訪問方式只能採用'[ ]'中括號訪問:
1 2 3 4 5 6 7 8 9 10 11 |
this .x);
|
1.3 屬性的查詢路徑
假設讀取某個物件的屬性x,首先會在此物件的例項屬性中查詢。若沒有找到,將會在此物件的原型物件中查詢屬性x。若原型物件也沒有屬性x,將繼續查詢這個原型物件的原型(假設原型物件含有原型),一直到找到屬性x或者無原型為止。
1.4 屬性的分類
物件中的屬性,根據是否自身的可分為自有屬性和繼承屬性。
① 自有屬性:也可叫例項屬性;指物件自身的屬性。
② 繼承屬性:也可叫原型屬性;指物件從原型中繼承的屬性。
2. 屬性的訪問方式
可分為 ' . '點訪問方式和' [ ] '中括號方法方式 。
說明:若讀取一個不存在的屬性,將返回undefined。若設定一個物件不存在的屬性,將會向物件新增此屬性。
2.1 ' . '點訪問方式
語法:obj.propertyName
說明:屬性名稱必須為一個標示符(靜態字串),不能為變數。
示例:
1 2 |
|
2.2 ' [ ] '中括號訪問方式
語法:obj[propertyName]
說明:屬性名稱可以為一個靜態字串,也可以為一個變數。若為變數,訪問的屬性為變量表示的值。
特點:與'.'訪問方式不同,'[ ]'中括號訪問方式靈活性很大:可動態訪問(變數指定屬性名)、可訪問包含某些特殊字元的屬性(如:屬性名稱帶'-')
示例:
1 2 3 4 |
|
3. delete 刪除屬性
語法:delete obj.propertyName 或者 delete obj[propertyName]
說明:delete只能刪除物件的自有屬性,不能刪除繼承屬性。
示例:
1 2 3 4 5 6 7 8 9 10 |
|
4. 檢測屬性
檢測物件是否包含某個屬性。
4.1 in 運算子
說明:判斷物件是否包含某個屬性,會從物件的例項屬性、繼承屬性裡進行檢測。
語法:propertyName in obj
返回值:
{bool} 判斷物件的例項屬性或繼承是否包含此屬性。
true:物件的例項屬性或繼承屬性包含此屬性;
false:物件的例項屬性或繼承屬性不包含此屬性。
示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
|
4.2 obj.hasOwnProperty(propertyName)
說明:判斷物件是否擁有一個指定名稱的例項屬性,不會檢查繼承屬性。
引數:
①propertyName {string} :屬性名稱。
語法:obj.hasOwnProperty(propertyName)
返回值:
{bool} 判斷物件是否擁有一個指定名稱的例項屬性;此方法不會檢查物件原型鏈中的屬性。
true :屬性為物件的例項屬性,非繼承。
false :屬性不為物件的例項屬性。
示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
|
4.3 obj.propertyIsEnumerable(propertyName)
說明:判斷指定名稱的屬性是否為例項屬性並且是可列舉的(可用for/in迴圈列舉)
引數:
①propertyName {string} :屬性名稱。
語法:obj.propertyIsEnumerable(propertyName)
返回值:
{bool} 判斷屬性是否為例項屬性並且是可列舉的(可用for/in迴圈列舉),不考慮原型鏈中的成員。
true :屬性為物件的例項屬性並且是可列舉的。
false :屬性不為物件的例項屬性或不可列舉的。
示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
|
4.4 總結
檢測方式 | 語法 | 檢測屬性的範圍 | 返回值 |
in 運算子 | propertyName in obj | 例項屬性、繼承屬性 | {bool} true:符合條件;fasle:不符合 |
obj.hasOwnProperty(propertyName) | obj.hasOwnProperty(propertyName) | 例項屬性 | {bool} true:符合條件;fasle:不符合 |
obj.propertyIsEnumerable(propertyName) | obj.propertyIsEnumerable(propertyName) | 可列舉的例項屬性 | {bool} true:符合條件;fasle:不符合 |
5. 遍歷屬性
即遍歷物件的例項屬性、繼承屬性。
5.1 for / in 語句塊
說明:遍歷物件可列舉的例項屬性和繼承屬性
語法:
for (p in obj) {
// p表示遍歷的屬性名稱
}
示例:
1 2 3 4 5 6 7 |
|
5.2 Object.keys(obj)
說明:返回一個數組,包含物件可列舉的例項屬性名稱
引數:
①obj {object} :例項物件
返回值:
{Array} 返回一個數組,包含物件可列舉的例項屬性名稱
示例:
1 2 3 4 5 6 7 |
|
5.3 Object.getOwnPropertyNames(obj)
說明:返回一個數組,包含物件的所有例項屬性名稱。包括可列舉和不可列舉的
引數:
①obj {object} :例項物件
返回值:
{Array} 返回一個數組,包含物件所有例項屬性名稱
與Object.keys()的差別:Object.keys()只返回可列舉的例項屬性,Object.getOwnPropertyNames()返回所有例項屬性
示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
|
5.4 總結
檢測方式 | 語法 | 遍歷屬性的範圍 | 返回值 |
for / in 語句塊 | for (p in obj) { // p表示遍歷的屬性名稱 } |
可列舉的例項屬性和繼承屬性 | {String} 屬性的名稱 |
Object.keys(obj) | Object.keys(obj) | 可列舉的例項屬性 | {Array} 返回一個數組,包含物件可列舉的例項屬性名稱 |
Object.getOwnPropertyNames(obj) | Object.getOwnPropertyNames(obj) | 包含物件的所有例項屬性名稱。包括可列舉和不可列舉的 | {Array} 返回一個數組,包含物件所有例項屬性名稱 |
6.屬性描述符
分為資料屬性和訪問器屬性;
兩者可相互轉換,若轉換後未設定enumerable和configurable特性(兩類屬性描述符都包含這2個特性),將預設採用轉換前的值。
6.1 資料屬性
說明:包含屬性的操作特性;如:設定值、是否可列舉等等
特性名稱 | 描述 | 預設值 |
value | 設定屬性的值 | undefined |
writable | 是否可修改屬性的值;true:可修改屬性的值;false:不可修改屬性的值 | false |
enumerable | 是否可列舉屬性;true:可列舉,可通過for/in語句列舉屬性;false:不可列舉 | false |
configurable | 是否可修改屬性的特性;true:可修改屬性的特性(如把writable從false改為true);false:不可修改屬性的特性 | false |
預設值:
1)在使用Object.defineProperty、Object.defineProperties 或 Object.create 函式的情況下新增資料屬性,writable、enumerable和configurable預設值為false。
2)使用物件直接量建立的屬性,writable、enumerable和configurable特性預設為true。
示例:
1 2 3 4 5 6 7 8 9 10 11 |
|
6.2 訪問器屬性
說明:設定屬性的訪問方式;set、get特性等
特性名稱 | 描述 | 預設值 |
get | 屬性的返回值函式 | undefined |
set | 屬性的設定值函式;含有一個賦值引數 | undefined |
enumerable | 是否可列舉屬性;true:可列舉,可通過for/in語句列舉屬性;false:不可列舉 | false |
configurable | 是否可修改屬性的特性;true:可修改屬性的特性(如把writable從false改為true);false:不可修改屬性的特性 | false |
示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
|