理解對象
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"