面向物件的語言有一個標誌,那就是語言中都有類的概念

前面的文章中我提到過ECMAScript中沒有類的概念(ES6之前)

所以JS中的物件和其他語言中的物件存在著一些區別

 

ECMA中對物件的定義如下:

無序屬性的集合,其屬性可以包含基本值、物件、或者函式

說白了JS中的物件可以看作散列表,無非就是一組名、值對

 

前面我在介紹JS中的引用型別的時候,已經介紹了物件定義的兩種方式:1、字面量 2、建構函式

這裡不再贅述

 

下面介紹一下物件上的一些屬性

 

屬性型別

ECMA中規定了兩種屬性型別:資料屬性和訪問器屬性,物件上的每個屬性都是其中的一種

這些屬性的特性不能直接訪問,只能使用ES5提供的Object.getOwnPropertyDescription(訪問的物件,訪問的屬性名)    第二個引數為字串

該方法返回一個物件,返回指定物件指定屬性的屬性描述符

 

1、資料屬性

對於這一型別的屬性有四種描述其行為的特性

  • configurable 能否通過delete刪除該屬性,或能否將其修改為訪問器屬性,預設為 true
  • enumerable 能否通過 for-in 迴圈返回該屬性 預設為 true
  • writable 能否修改屬性的值 預設為true
  • value 儲存該屬性的值 預設為undefined

要修改上述特性只能通過ES5提供的另外一個函式 Object.defineProperty(定義的物件, 屬性名, 特性描述符)

PS.要注意的是:一旦將configurable設為false就不能修改除了writable特性的其他特性了(包括configurable本身)

當對屬性進行違反其特性的操作時,會靜默地失敗,嚴格模式會報錯

 

2,、訪問器屬性

訪問器屬性沒有value特性,value特性和訪問器屬性的特性只能存在一種

訪問器屬性有以下特性

  • configurable 能否通過delete刪除該屬性,或能否將其修改為訪問器屬性,預設為 true
  • enumerable 能否通過 for-in 迴圈返回該屬性 預設為 true
  • get 定義該屬性被訪問時要執行的函式 預設undefined
  • set 定義該屬性被執行修改操作時執行的函式 預設undefined

由於get、set特性讓我們可以在資料進行操作時,執行函式,所以可以用其實現一些MVV*框架的雙向資料繫結

var obj = {values:null}; // 定義value屬性用於儲存值
Object.defineProperty(obj, data , {
   get: function(){
         return this.values; 
    },
   set: function(value){
        this.values = value;
        // 其他操作
    }  
})

其中get、set不一定要同時指定,只指定get表示該屬性只讀,只指定set表示該屬性只能寫不能讀

 

 

PS.今天就先介紹物件的屬性,要注意的是定義屬性特性和讀取屬性特性都有複數方法:getOwenPropertyDescriptions、defineProperties

除此而外上述操作只能在支援ES5的瀏覽器中執行,這也是使用訪問器屬性實現的Vue只相容到IE9的原因