天天看點

面向對象(一):對象屬性

對象屬性類型

每個對象都是基于一個引用類型建立的

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); //karine
           

【通路器屬性】

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, "屬性名")//取得原型屬性的屬性特性
           

繼續閱讀