面向對象的程序設計之理解對象

理解對象

1、創建自定義對象的兩種方法:

(1)創建一個Object實例,然後再爲它添加屬性和方法。

var person = new Object();
    person.name = "Nicholas";
    person.age = 29;
    person.job = "Software Engineer";

    person.sayName = function() {
        alert(this.name);
    };

(2)用對象字面量語法創建
屬性名或方法名 : 值

var person = {
    name : "Nicholas",
    age : 29,
    job : "Software Engineer",

    sayName : function() {
        alert (this.name);
    }
};

2、屬性類型

ECMAScript中有兩種屬性:數據屬性和訪問器屬性。
(1)數據屬性:數據屬性包含一個數據值的位置,在這個位置可以讀取和寫入值,數據屬性有4個描述其行爲的特性:

修改屬性默認的特性,必須使用ECMAScript5的Object.defineProperty()方法。這個方法接收三個參數:屬性所在的對象、屬性的名字和一個描述符對象。其中,描述符對象的屬性必須是configurable、enumerable、writable和value。設置其中的一個或多個值,可以修改對應的特徵值。

var person = {};
Object.defineProperty(person, "name", {
    writable : false,
    value : "Nicholas"
});

alert(person.name);  //"Nicholas"
person.name = "Greg";
alert(person.name); //"Nicholas"

本例中將name屬性的write值設置爲false表示只可讀不可寫。吧configurable設置爲false,表示不能從對象中刪除屬性。一旦把屬性定義爲不可配置的,就不能再把它變回可配置了。
注意:在調用Object.defineProperty()方法創建一個新的屬性時,如果不指定,configurable、enumerable和writable特性的默認值都是false。
(2)訪問器屬性
訪問器屬性不包含數據值:它們包含一對兒getter和setter函數。在讀取訪問器屬性時,會調用getter函數,這個函數負責返回有效的值;在寫入訪問器屬性時,會調用setter函數並傳入新值,這個函數負責決定如何讓處理數據。訪問器屬性有如下4個特性:

  • [[Set]]:在寫入屬性時調用的函數。默認值爲Undefined。

訪問器屬性不能直接定義,必須使用Object.defineProperty()來定義。

object.defineProperty(book,"year", {
    ger : function() {
        return this._year;
    },
    set : function(newValue) {
        if(newValue > 2004) {
            this._year = newValue;
            this.edition += newValue - 2004;
        }
    }
});
book.year = 2005;
alert(book.edition); //2 

_year前面的下劃線是一種常用的記號,用於表示只能通過對象方法訪問的屬性。

3、定義多個屬性

Object.defineProperties()方法。利用這個方法可以通過描述符一次定義多個屬性。這個方法接收兩個對象參數:要添加和修改其屬性值的對象,第二個是與第一個對象中要添加和修改的屬性值一一對應。

var book = {};
Object.defineProperties(book, {
    _year: {
        writable : true,
        value : 2004
    },
    edition: {
        writable: true,
        value: 1
    },
    year: {
        get: function() {
            return this._year;
        },
        set: function(newValue) {
            if(newValue > 2004) {
                this._year = newValue;
                this.edition += newValue - 2004;
            }
        }
    }
});

以上代碼在book對象上定義了兩個數據屬性(_year和edition)和一個訪問器屬性(year)。

4、讀取屬性的特性

Object.getOwnPropertyDescriptor()方法,可以去的給定屬性的描述符。這個方法接收兩個參數:屬性所在的對象和要讀取其描述符的屬性名稱,返回值是一個對象。
如果是訪問器屬性,這個對象的屬性有configurable、 enumerable、get和set;
如果是數據屬性,這個對象的屬性有configurable、enumerable、writable和value。

var book = {};
Object.defineProperties(book, {
    _year: {
        writable : true,
        value : 2004
    },
    edition: {
        writable: true,
        value: 1
    },
    year: {
        get: function() {
            return this._year;
        },
        set: function(newValue) {
            if(newValue > 2004) {
                this._year = newValue;
                this.edition += newValue - 2004;
            }
        }
    }
});

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

var descriptor = Object.getOwnPropertyDescriptor(book, "year");
alert(descriptor.value);   //undefined
alert(descriptor.enumerable);  //false
alert(typeof descriptor.get);  //"function"
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章