1)創建對象:字面量和構造函數
var?obj?=?{}; //字面量
var?obj?=?new?Object(); //構造函數
2)屬性操作
對象里的屬性有如下特性:
數據屬性:
configurable:設置屬性是否能被刪除,屬性的特性是否能被設置,能否修改屬性的值等;
enumerable:設置屬性是否可枚舉
writable:設置屬性的值能否被修改
value:設置屬性的值
在添加一個對象的屬性時默認上面的特性都為true,而value則是屬性的值,如果想通過自定義這些特性來設置對象屬性,可以通過Object.defineProperty,如下:
var?person?=?{name:"張三"};
Object.defineProperty(person,name,{configurable:true,enumerable:true,writable:true,value:"李四”});
在上面所設置的特性當中,configurable如果為false表示屬性特性設置在之后不能被改動(除了writable,writable在configurable為false時仍然可以設置成false),而且configurable一旦為false后就不能再設置成true了,
而enumberable如果為false則表示該屬性不可枚舉,用for?in循環輸出對象屬性時該屬性不會被輸出;
writable很明顯,為false時則表示不可修改該屬性的值(不過當configurable為true時可以通過修改value的值直接改寫或者將writable修改為true)
Object.defineProperty(person,name,{configurable:false});
delete?person.name; //delete操作不成功
Object.defineProperty(person,name,{enumerable:false}); //操作不成功
...
訪問器屬性
configurable:設置屬性是否能被刪除,屬性的特性是否能被設置,能否修改屬性的值等;
enumerable:設置屬性是否可枚舉
get?/?set?:在讀寫屬性時會自動調用的函數
比如:
var?book?=?{
???_year:2004,
???edition:1
};
Object.defineProperty(book,"year",{
???get:function(){
????????return?this._year;
???},
???set:function(newValue){
???????this._year?=?newValue;
???????this.edition?+=?newValue?-?2004;
???}
});
book.year?=?2005; //當要設置year屬性時,會自動調用set方法
alert(book.edition);
如果要的不止是配置單單一個屬性,而是要同時配置多個,可以通過Object.defineProperties,如下:
var?person?=?{name:"張三"};
Object.defineProperty(person,{
??????name:{value:"李四”,configurable:false},
??????sex:{value:"man",writable:false}
});
在配置完屬性后或者通過Object.defineProperty更改過屬性后想讀者該屬性,可以通過Object.getOwnPropertyDescriptor讀取
Object.getOwnPropertyDescriptor(book,"edition"); //讀取book對象中的edition屬性
3)對象標簽
[[proto]]:
對象中有個屬性[[proto]]指向它的構造器的原型
[[class]]:
看不懂視頻里在講啥-?-,沒說為啥是通過Object.prototype.toString去獲取[[class]]的,所以還是不懂[[class]]的含義
[[extensible]]:
var?obj?=?{x:1,y:2};
Object.isExtensible(obj); //檢測對象是否可擴展,一般來說默認都是true
Object.preventExtensions(obj); //禁止對象可擴展
Object.defineProperty(obj,"x",{value:2}); //雖然禁止了對象擴展,但是刪除或者修改屬性的值以及標簽
Object.seal(obj); //禁止對象屬性被刪除以及配置屬性標簽
Object.isSealed(obj); //判斷對象是否被seal
Object.freeze(obj); //凍結對象,禁止對象屬性值被改寫
Object.isFrozen(obj); //判斷對象是否被freeze
4)序列化
在向后臺發送請求數據時,用JSON.stringify將對象轉化為字符串,用JSON.parse將字符串解析為對象
但是,在用JSON.stringify將對象轉化為字符串時如果對象屬性的值為undefined,那么它將不會出現在轉化后的字符串里
如果我們想自定義序列化,可以在對象里自定義toJSON方法,同理,我們在將對象toString或者valueOf時也可以自定義toString方法和valueOf方法
對象轉化為基本類型的過程:
在后臺首先會自動調用valueOf方法嘗試將對象轉化為基本類型,如果valueOf不存在或者無法轉化為基本類型則會調用toString方法繼續嘗試,如果兩種都無法將對象轉化為基本類型則會報錯
2016-09-09
看不懂,就要多學習,沒有人一下就能看懂的,看不懂就從最基礎開始學習