JavaScript系列-----Objectj基於哈希存儲<Key,Value>之Value
1.問題提出
在JavaScript系列-----Object之基於Hash<Key,Value>存儲之Key篇 (1)中,我們推理出:對象是以Hash結構存儲的,對象的屬性被表示為多個<Key,Value>鍵值對。
其中,Key的數據類型是字符串,但是,我們並沒有說Value是以什么數據結構存儲的,在本文中,我們將繼續討論:Value的存儲類型-----博文的核心
既然在JavaScript中,對象的屬性是以鍵值對的形式存儲的,那么我們知道必須需要知道對象屬性的三種類型:
-
- 基本數據類型的屬性
- 引用數據類型的屬性
- 數據訪問器屬性
我們用一個例子來分別說明這三種屬性類型:
var person = {}; person.name = '張三'; //第一種,基本數據類型屬性 person.age = 18; peron.getName = function () { //第二種,引用數據類型的屬性,因為在js中函數也是對象 return this.name; } Object.defineProperty(person, 'isAdult', { //第三種,訪問器屬性 get: function () { if (person.age >= 18) { return true; } else { return false; } } }); console.log(person.isAdult); //true
通過上例,我們認識到三種屬性類型后,那么,接下來我們來談談Value是怎么表示這三種屬性的!
2.<Key,Value>中Value的數據結構
在JavaScript高級程序設計(第三版)中,是這么描素屬性的:屬性在創建時都帶有一些特征值,JavaScript引擎通過這些特征值來定義他們的行為。
下面,分別討論這三種屬性分別用哪些特征值來描述:
(1).基本數據類型的屬性
var person = {}; person.name = '張三'; var descriptor=Object.getOwnPropertyDescriptor(person,"name"); console.log(descriptor); //輸出結果:
configurable
|
true |
enumerable
|
true |
value
|
"張三" |
writable
|
true |
(2).引用數據類型的屬性
var person = {}; person.getName = function () { return this.name; }
person.child={name:"張四"}; var descriptor = Object.getOwnPropertyDescriptor(person, 'getName'); console.log(descriptor); //輸出結果:
configurable
|
true |
enumerable
|
true |
writable
|
true |
value
|
function() |
var descriptor1 = Object.getOwnPropertyDescriptor(person, 'child');
console.log(descriptor1); //輸出結果:
configurable
|
true |
enumerable
|
true |
value
|
Object { name="張四"} |
writable
|
true |
(3).訪問器類型的屬性
var person = {}; Object.defineProperty(person, 'isAdult', { get: function () { if (person.age >= 18) { return true; } else { return false; } } }); var descriptor=Object.getOwnPropertyDescriptor(person,"isAdult"); console.log(descriptor); //輸出結果:
configurable
|
false |
enumerable
|
false |
set
|
undefined |
get
|
function() |
從上面三個例子可以看書,Value也是用一對對<Key,Value>表示的一個結構體。當然,我們也可以將Value看做一個對象,因為對象本來就是結構體。
那么,問題的答案就顯而易見了:
對象是以Hash結構存儲的,用<Key,Value>鍵值對表示對象的屬性,Key的數據類型為字符串,Value的數據類型是結構體,即對象是以<String,Object>類型的HashMap結構存儲的。
3.Value中的各種特性值的含義
(1)數據類型的特性(基本數據類型屬性和引用數據類型屬性)
從第二部分我們可以看出,數據類型的屬性的特性值有四個:
特性 | 數據類型 | 意義 |
configurable | boolean | 表示能否修改此屬性特性,為false時,此屬性不能刪除(針對delete),且不能修改 |
enumerable | booelan | 表示此屬性是否能被枚舉,為false時,不能被枚舉得到(針對 for-(in)) |
writeable | boolean | 表示是否能夠修改屬性的值,為false時,此屬性的值不能被修改 |
value | 根據具體值設定 | 屬性的數據值,寫入屬性的時候把新值保存在這個位置 |
(2)訪問器類型的特性(訪問器類型的屬性)
特性 | 數據類型 | 意義 |
configurable | boolean | 表示能否修改此屬性特性,為false時,此屬性不能刪除(針對delete),且不能修改 |
enumerable | booelan | 表示此屬性是否能被枚舉,為false時,不能被枚舉得到(針對 for-(in)) |
get | function | 通過該函數返回該屬性的值 |
set | function | 修改該屬性的值,參數為屬性的值. |
一點引申(Value中其他的特性):
<Key,Value>中Value是一個結構體,其保存的難道就只有上述列舉出的特性嗎?------當然不是
例如: 在描述數據類型的四個特性的value中,value也可以表示一個對象,也可以表示字符串,也可以表示數字,那么也就肯定存在對value所表示類型的描述,只不過JS引擎是在后台處理,我們 看不到而已。
當然,在<Key,Vaule>的Value中還肯定存在另外一個特性,(base)-----base是一中引用類型的數據,指向擁有該屬性的對象。當value是函數類型的時候,該函數被調用時,用base來於初始化this指針,(當然,這些已超出我們要討論的范圍)。