對象屬性類型
每個對象都是基於一個引用類型創建的
1. 數據屬性
2. 訪問器屬性
【數據屬性】
4個特性:
1. [[Configurable]]:能否delete屬性從而重新定義屬性、能否修改屬性的特性、能否把屬性改爲訪問器屬性
2. [[Enumerable]]:能否用for-in循環返回屬性
3. [[Writable]]:能否修改屬性的值
4. [[Value]]:包含該屬性的值
**已經在對象上直接定義的屬性,其[[Confgurable]]、[[Enumerable]]、[[Writable]]默認值爲true,
[[Value]]默認值爲undefined
**通過Object.defineProperty()方法創建一個新屬性時,其[[Confgurable]]、[[Enumerable]]、
[[Writable]]默認值爲false。
修改屬性默認特性的方法:
Object.defineProperty(屬性所屬對象,“屬性名”,{
要修改的特性1:修改值,
要修改的特性2:修改值,
……
});
**需要注意的是,一旦把configurable修改爲false,就再也不能修改該屬性的特性(除了writable,可以由true改爲false,但不能由false
改爲true);
**當configurable修改爲false時,包括configurable本身也不能改爲true;
**當configurable修改爲false時,該屬性會被禁止刪除
var person = {};
Object.defineProperty(person,"name",{
configurable: false,
value: "karine"
});
console.log(person.name);
【訪問器屬性】
4個特性:
1. [[Configurable]]:能否delete屬性從而重新定義屬性、能否修改屬性的特性、能否把屬性改爲訪問器屬性。
默認值爲false
2. [[Enumerable]]:能否用for-in循環返回屬性。默認值爲false
3. [[Get]]:讀取屬性時調用的函數。默認值爲undefined
4. [[Set]]:寫入屬性時調用的函數。默認值爲undefined
訪問器屬性不能直接在對象上定義,必須Object.defineProperty(屬性所屬對象,“屬性名”,{
要定義的特性1:值,
要定義的特性2:值,
……
});
舊方法:
對象名.__defineGetter__(“屬性名”,function(){
…;});
對象名.__defineSetter__(“屬性名”,function(){
…;});
定義對象的屬性:
1. 一個屬性
Object.defineProperty(屬性所屬對象名,“屬性名”,{
特性1:……,
特性2:……,
……
});
2. 多個屬性
Object.defineProperties(對象名,{
屬性1:{
特性1: …,
特性2: …,
…
},
屬性2:{
特性1: …,
特性2: …,
…
}
});
讀取對象的屬性特性
1. var descriptor = Object.getOwnPropertyDescriptor(對象名,"屬性名"); //返回一個對象
descriptor.特性;
2. Object.getOwnPropertyDescriptor(實例名,“屬性名”)//取得實例屬性的屬性特性
3. Object.getOwnPropertyDescriptor(構造函數名.prototype, "屬性名")//取得原型屬性的屬性特性