天天看點

JavaScript面向對象屬性類型

屬性類型

  • 資料屬性
    • [configurable]:表示能否通過delete删除屬性進而重新定義屬性,能否修改屬性的特性,或者能否把屬性修改為通路器屬性。預設值為true
    • [Enumerable]:表示能否通過for-in循環傳回屬性。預設值為true
    • [Writable]:表示能否修改屬性的值。預設值為true
    • [Value]:包含這個屬性的值。預設值為undefined
    • –>要修改屬性預設的特性,必須使用ECMAScript5的object.defineProoerty()方法。這個方法接收三個參數:屬性所在的對象、屬性的名字和一個描述符對象。其中描述符(descriptor)對象的屬性必須是:configurable,enumerable,writable和value。`代碼如下
var person = {};
        Object.defineProperty(person, "name", {
            writable: false,
            value: "Nicholas"
        });

        alert(person.name);
        person.name = "Michael";
        alert(person.name);
           
  • 通路器屬性
    • 通路器屬性不包含資料值,它們包含以對getter和setter函數。在讀取通路器屬性時,會調用getter函數,這個函數負責傳回有效地值;在寫入通路器屬性時,會調用setter函數并傳入新值,這個函數負責決定如何處理資料。通路器屬性有4個特性。
    • [configurable]:表示能否通過delete删除屬性進而重新定義屬性,能否修改屬性的特性,或者能否把屬性修改為通路器屬性。預設值為true
    • [Enumerable]:表示能否通過for-in循環傳回屬性。預設值為true
    • [get]:在讀取屬性時調用的函數。預設值為undefined
    • [set]:在讀入屬性時調用的函數。預設值為undefined
    • 通路器屬性不能直接定義,必須使用object.defneProperty()來定義。代碼如下
var book = {
            _year: ,
            edition: 
        };

        Object.defineProperty(book, "year", {
            get: function(){
                return this._year;
            },
            set: function(newValue){

                if (newValue > ) {
                    this._year = newValue;
                    this.edition += newValue - ;

                }
            }
        });

        book.year = ;
        alert(book.edition);   //2
           
  • 讀取屬性特征
    • object.getOwnPropertyDescriptor()方法可以取得給定屬性的描述符。這個方法接受兩個參數L屬性所在的對象和要讀取器描述符的屬性名稱。傳回值是一個對象,如果是通路器屬性,這個對象屬性有configurable,enumerable,get,set;如果是資料屬性,這個對象的屬性有configurable,enumerable,writable,value。代碼如下
var book = {};

        Object.defineProperties(book, {
            _year: {
                value: 
            },

            edition: {
                value: 
            },

            year: {            
                get: function(){
                    return this._year;
                },

                set: function(newValue){
                    if (newValue > ) {
                        this._year = newValue;
                        this.edition += newValue - ;
                    }                  
                }            
            }        
        });

        var descriptor = Object.getOwnPropertyDescriptor(book, "_year");
        alert(descriptor.value);          //2004
        alert(descriptor.configurable);   //false
        alert(typeof descriptor.get);     //"undefined"

        var descriptor = Object.getOwnPropertyDescriptor(book, "year");
        alert(descriptor.value);          //undefined
        alert(descriptor.enumerable);     //false
        alert(typeof descriptor.get);     //"function"
           

`

繼續閱讀