JavaScript系列-----對象基於哈希存儲( 之Value篇) (3)


JavaScript系列-----Objectj基於哈希存儲<Key,Value>之Value


 

1.問題提出

JavaScript系列-----Object之基於Hash<Key,Value>存儲之Key篇 (1)中,我們推理出:對象是以Hash結構存儲的,對象的屬性被表示為多個<Key,Value>鍵值對。

其中,Key的數據類型是字符串,但是,我們並沒有說Value是以什么數據結構存儲的,在本文中,我們將繼續討論:Value的存儲類型-----博文的核心

既然在JavaScript中,對象的屬性是以鍵值對的形式存儲的,那么我們知道必須需要知道對象屬性的三種類型:

    1. 基本數據類型的屬性
    2. 引用數據類型的屬性
    3. 數據訪問器屬性

我們用一個例子來分別說明這三種屬性類型:

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指針,(當然,這些已超出我們要討論的范圍)。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM