js基礎陣營:變量篇之特殊變量-對象

這一章,我們將好好去看看一個特殊的變量,對象。
我們先看看官方的定義:無序?qū)傩缘募?,其屬性可以包含基本值,對象,或者函?shù)。從字面意思上,我們可以理解為對象是一個沒有特定順序的的集合,對象的每一個屬性和方法都有一個自己的名稱,每一個名稱都會有一個值,當然這個值,可以使對象,函數(shù)。以及其他基本類型數(shù)據(jù)。
不過還是太抽象了,我個人其實更傾向于將對象理解成一個“圖紙”,一個建房子的圖紙,在這個圖紙上,我們標明了房子的具體形狀,哪里開窗戶等等一系列的參數(shù),那么說到對象,就必然會說到實例,同樣的道理,在我的理解里,實例,就是按照“圖紙”來創(chuàng)建的一個個房子。那么對象這個圖紙,有哪些屬性和方法呢?

屬性類型

對象有兩種屬性:數(shù)據(jù)屬性以及訪問器屬性

數(shù)據(jù)屬性

  1. configurable:表示對象是否可以通過delete來刪除屬性
  2. Enumerable:表示是否可以通過for in 循環(huán)返回屬性
  3. Writable:表示是否可以修改屬性
  4. Value: 表示數(shù)據(jù)的值。

那么我們?nèi)绾稳バ薷囊约霸O置這些值呢?好在js提供了一個方法,Object.defineProperty(obj(屬性所在的對象),name(屬性的名稱),dataTypeObj(所要處理的數(shù)據(jù)類型))方法,如果不指定參數(shù)的話,以上1,2,3個數(shù)據(jù)屬性都將是默認值true,如果指定了參數(shù),將會將對象的具體屬性的數(shù)據(jù)屬性類型進行特殊處理。下面我們已房子圖紙為例,來看下如何處理

var house = {};
Object.defineProperty(house,'name',{
    configurable:false,
    value:'二鍋頭的房子圖紙'
});
console.log(house.name);
delete house.name;
console.log(house.name);

復制到控制臺,我們看下會顯示什么

configurable.png

可以很明顯的看出,沒有被刪除掉。
現(xiàn)在我們在看看writable,請看代碼

var house = {};
Object.defineProperty(house,'name',{
    writable:false,
    value:'二鍋頭的房子圖紙'
});
console.log(house.name);
house.name = '我要修改';
console.log(house.name);

在控制臺看下結(jié)果

image.png

最后我們來看下enumerable

var house = {};
Object.defineProperty(house,'name',{
    enumerable:false,
    value:'二鍋頭的房子圖紙'
});
for(var key in house){
   console.log(key + ':' + house[key])
}

在控制臺中沒有任何的輸出,說明無法通過for in 來循環(huán)出書數(shù)據(jù)
上面我們說明了對象的4個數(shù)據(jù)類型,下面我們來看看對象的訪問器屬性

訪問器屬性

訪問器屬性是成對出現(xiàn)的,存與取

  1. getter 對象訪問任何一個屬性的時候,都需要先通過調(diào)用getter函數(shù),由其返回屬性的值。
  2. setter 對象的具體的屬性寫入值的時候,都會調(diào)用setter函數(shù),將值寫入。

同時對于訪問器屬性,js同樣提供了configurable以及enumerable屬性。如果不設置值的話,將默認為false.
同數(shù)據(jù)屬性一樣,訪問器屬性不能跟直接的定義,只能通過Object.defineProperty()方法來設置。同樣以上面的例子來說明

var house = {
   name:'二鍋頭的房子',
   totalMoney:0
};
Object.defineProperty(house,'money',{
  configurable:false,
  get:function(){
    return this.totalMoney + '元';
  },
  set:function(val) {
    this.totalMoney = val;
  }
});
house.money = 200000;
console.log(house);
console.log(house.money);
delete house.money;
console.log(house.money);

將代碼拷貝到控制臺,我們來看下結(jié)果
image.png

我們明明在賦值的時候給的是20000,為啥后面會多一個元呢?這就是get的功能。這樣當我們賦值以及讀取的時候我們都能夠?qū)崟r的監(jiān)控了,這也就使得vue的誕生了,后面詳細說下vue的原理。(又挖一個坑)
那么我們?nèi)绾稳プx取一個對象的屬性值呢?

屬性特性的讀取

在js中,我們難免會需要知道一個對象的數(shù)據(jù)屬性以及訪問器屬性具體設置的值,所以js提供了Object.getOwnPropertyDescriptor()方法,來獲取,同樣以上面的例子來舉例。

var house = {
   name:'二鍋頭的房子',
   totalMoney:0
};
Object.defineProperty(house,'money',{
  configurable:false,
  get:function(){
    return this.totalMoney + '元';
  },
  set:function(val) {
    this.totalMoney = val;
  }
});
console.log(Object.getOwnPropertyDescriptor(house,'money'));

復制代碼到控制臺,我們來看下結(jié)果
image.png

至此,我們關(guān)于對象的基本知識說完了,下一章,我們將一起來看看對象的創(chuàng)建

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容