ECMAScript 中沒有類的概念查近,因此它的對象也與基于類的語言中的對象有所不同僧家。
- 創(chuàng)建自定義對象的最簡單方式就是創(chuàng)建一個Object 的實(shí)例,然后再為它添加屬性和方法
var person = new Object();
person.name = "Nicholas";
person.age = 29;
person.job = "Software Engineer";
person.sayName = function(){
alert(this.name);
};
- 對象字面量成為創(chuàng)建這種對象的首選模式
var person = {
name: "Nicholas",
age: 29,
job: "Software Engineer",
sayName: function(){
alert(this.name);
}
};
屬性類型
- ECMAScript 中有兩種屬性:數(shù)據(jù)屬性和訪問器屬性。
1乎婿、數(shù)據(jù)屬性
數(shù)據(jù)屬性包含一個數(shù)據(jù)值的位置肠阱。在這個位置可以讀取和寫入值票唆。數(shù)據(jù)屬性有4個描述其行為的特性。
- [[Configurable]]:表示能否通過delete刪除屬性從而重新定義屬性屹徘,能否修改屬性的特
性走趋,或者能否把屬性修改為訪問器屬性。直接在對象上定義的屬性缘回,它們的這個特性默認(rèn)值為true吆视。 - [Enumerable]]:表示能否通過for-in 循環(huán)返回屬性。直接在對象上定義的屬性酥宴,它們的
這個特性默認(rèn)值為true啦吧。 - [[Writable]]:表示能否修改屬性的值。直接在對象上定義的屬性拙寡,它們的這個特性默認(rèn)值為true授滓。
- [[Value]]:包含這個屬性的數(shù)據(jù)值。讀取屬性值的時候肆糕,從這個位置讀般堆;寫入屬性值的時候,把新值保存在這個位置诚啃。這個特性的默認(rèn)值為undefined淮摔。
- 要修改屬性默認(rèn)的特性,必須使用ECMAScript 5的Object.defineProperty()方法始赎。這個方法接收三個參數(shù):屬性所在的對象和橙、屬性的名字和一個描述符對象仔燕。其中,描述符(descriptor)對象的屬性必須是:configurable魔招、enumerable晰搀、writable 和value。設(shè)置其中的一或多個值办斑,可以修改對應(yīng)的特性值外恕。
var person = {};
Object.defineProperty(person, "name", {
writable: false,
value: "Nicholas"
});
alert(person.name); //"Nicholas"
person.name = "Greg";
alert(person.name); //"Nicholas"
var person = {};
Object.defineProperty(person, "name", {
configurable: false,
value: "Nicholas"
});
alert(person.name); //"Nicholas"
delete person.name;
alert(person.name); //"Nicholas"
//把configurable 設(shè)置為false,表示不能從對象中刪除屬性乡翅。如果對這個屬性調(diào)用delete鳞疲,則在非嚴(yán)格模式下什么也不會發(fā)生,而在嚴(yán)格模式下會導(dǎo)致錯誤峦朗。
- 一旦把屬性定義為不可配置的建丧,就不能再把它變回可配置了。此時波势,再調(diào)用Object.defineProperty()方法修改除writable 之外的特性翎朱,都會導(dǎo)致錯誤
var person = {};
Object.defineProperty(person, "name", {
configurable: false,
value: "Nicholas"
});
//拋出錯誤
Object.defineProperty(person, "name", {
configurable: true,
value: "Nicholas"
});
- 在調(diào)用Object.defineProperty()方法時,如果不指定尺铣,configurable拴曲、enumerable 和
writable 特性的默認(rèn)值都是false。
2凛忿、訪問器屬性
訪問器屬性不包含數(shù)據(jù)值澈灼,它們包含一對兒getter和setter函數(shù)(非必需),在讀取訪問器屬性時店溢,會調(diào)用getter 函數(shù)叁熔,這個函數(shù)負(fù)責(zé)返回有效的值;在寫入訪問器屬性時床牧,會調(diào)用setter 函數(shù)并傳入新值荣回,這個函數(shù)負(fù)責(zé)決定如何處理數(shù)據(jù)。
- [[Configurable]]:表示能否通過delete刪除屬性從而重新定義屬性戈咳,能否修改屬性的特
性心软,或者能否把屬性修改為數(shù)據(jù)屬性。對于直接在對象上定義的屬性著蛙,這個特性的默認(rèn)值為
true删铃。 - [[Enumerable]]:表示能否通過for-in循環(huán)返回屬性。對于直接在對象上定義的屬性踏堡,這
個特性的默認(rèn)值為true猎唁。 - [[Get]]:在讀取屬性時調(diào)用的函數(shù)。默認(rèn)值為undefined顷蟆。
- [[Set]]:在寫入屬性時調(diào)用的函數(shù)胖秒。默認(rèn)值為undefined缎患。
- 訪問器屬性不能直接定義,必須使用Object.defineProperty()來定義
var book = {
_year: 2004,
edition: 1
};
Object.defineProperty(book, "year", {
get: function(){
return this._year;
},
set: function(newValue){
if (newValue > 2004) {
this._year = newValue;
this.edition += newValue - 2004;
}
}
});
alert(book.year); //2004
book.year = 2005;
alert(book.edition); //2
定義多個屬性
- 由于為對象定義多個屬性的可能性很大阎肝,ECMAScript5又定義了一個Object.defineProperties()方法。
- 利用這個方法可以通過描述符一次定義多個屬性肮街。這個方法接收兩個對象參數(shù):第一個對象是要添加和修改其屬性的對象风题,第二個對象的屬性與第一個對象中要添加或修改的屬性一一對應(yīng)
var book = {};
Object.defineProperties(book, {
_year: {
value: 2004
},
edition: {
value: 1
},
year: {
get: function(){
return this._year;
},
set: function(newValue){
if (newValue > 2004) {
this._year = newValue;
this.edition += newValue - 2004;
}
}
}
});
讀取屬性的特性
- 使用ECMAScript 5 的Object.getOwnPropertyDescriptor()方法,可以取得給定屬性的描述符嫉父。
- 這個方法接收兩個參數(shù):屬性所在的對象和要讀取其描述符的屬性名稱沛硅。返回值是一個對象。
- 如果是訪問器屬性绕辖,這個對象的屬性有configurable摇肌、enumerable、get 和set仪际。
- 如果是數(shù)據(jù)屬性围小,這個對象的屬性有configurable、enumerable树碱、writable 和value肯适。
var book = {};
Object.defineProperties(book, {
_year: {
value: 2004
},
edition: {
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
alert(typeof descriptor.get); //"undefined"
var descriptor = Object.getOwnPropertyDescriptor(book, "year");
alert(descriptor.value); //undefined
alert(descriptor.enumerable); //false
alert(typeof descriptor.get); //"function"
- 在JavaScript 中,可以針對任何對象——包括 DOM 和BOM 對象成榜,使用Object.getOwnPropertyDescriptor()方法框舔。
- 支持這個方法的瀏覽器有IE9+、Firefox 4+赎婚、Safari 5+刘绣、Opera 12+和Chrome。
好好學(xué)習(xí)