這一章,我們將好好去看看一個特殊的變量别渔,對象附迷。
我們先看看官方的定義:無序屬性的集合惧互,其屬性可以包含基本值,對象喇伯,或者函數(shù)喊儡。從字面意思上,我們可以理解為對象是一個沒有特定順序的的集合稻据,對象的每一個屬性和方法都有一個自己的名稱艾猜,每一個名稱都會有一個值,當然這個值捻悯,可以使對象匆赃,函數(shù)。以及其他基本類型數(shù)據(jù)秋度。
不過還是太抽象了炸庞,我個人其實更傾向于將對象理解成一個“圖紙”钱床,一個建房子的圖紙荚斯,在這個圖紙上,我們標明了房子的具體形狀查牌,哪里開窗戶等等一系列的參數(shù)事期,那么說到對象,就必然會說到實例纸颜,同樣的道理兽泣,在我的理解里,實例胁孙,就是按照“圖紙”來創(chuàng)建的一個個房子唠倦。那么對象這個圖紙,有哪些屬性和方法呢涮较?
屬性類型
對象有兩種屬性:數(shù)據(jù)屬性以及訪問器屬性
數(shù)據(jù)屬性
- configurable:表示對象是否可以通過delete來刪除屬性
- Enumerable:表示是否可以通過for in 循環(huán)返回屬性
- Writable:表示是否可以修改屬性
- Value: 表示數(shù)據(jù)的值稠鼻。
那么我們如何去修改以及設置這些值呢?好在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);
復制到控制臺亚皂,我們看下會顯示什么
可以很明顯的看出,沒有被刪除掉国瓮。
現(xiàn)在我們在看看writable,請看代碼
var house = {};
Object.defineProperty(house,'name',{
writable:false,
value:'二鍋頭的房子圖紙'
});
console.log(house.name);
house.name = '我要修改';
console.log(house.name);
在控制臺看下結果
最后我們來看下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)的,存與取
- getter 對象訪問任何一個屬性的時候厂财,都需要先通過調用getter函數(shù)芋簿,由其返回屬性的值。
- setter 對象的具體的屬性寫入值的時候璃饱,都會調用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);
將代碼拷貝到控制臺廓潜,我們來看下結果我們明明在賦值的時候給的是20000抵皱,為啥后面會多一個元呢?這就是get的功能辩蛋。這樣當我們賦值以及讀取的時候我們都能夠實時的監(jiān)控了呻畸,這也就使得vue的誕生了,后面詳細說下vue的原理悼院。(又挖一個坑)
那么我們如何去讀取一個對象的屬性值呢伤为?
屬性特性的讀取
在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'));
復制代碼到控制臺位衩,我們來看下結果至此,我們關于對象的基本知識說完了便脊,下一章蚂四,我們將一起來看看對象的創(chuàng)建