??創(chuàng)建Object實例的方式有兩種:
var person = new Object(); //var person = {};
person.name = "wang";
person.age = 22;
person.job = "Software Engineer";
person.sayName = function(){
alert(this.name);
};
//對象字面量表示法
var person = {
name : "wang",
age :22,
job : "Software Engineer",
sayName: function(){
alert(this.name);
}
};
1 理解對象
??上面的例子創(chuàng)建了一個名為 person的對象,并為它添加了三個屬性和一個方法。其中this.name將被解析為person.name的值。
??這些屬性在創(chuàng)建時都帶有一些特征值( characteristic ),JS通過這些特征值來定義它們的行為。
1.1 屬性類型
??ECMA-262第5版在定義只有內(nèi)部采用的特性(attribute)時,描述了屬性(property)的各種特性。
?數(shù)據(jù)屬性:
?數(shù)據(jù)屬性包含一個數(shù)據(jù)值的位置。在這個位置可以讀取和寫入值。數(shù)據(jù)屬性有四個描述其行為的特性。
- [ [ Configurable ] ] :表示能否通過 delete 刪除屬性。默認值:true;
- [ [ Enumerable ] ]:表示能否通過 for-in 循環(huán)返回屬性。默認值:true;
- [ [ Writable ] ]:表示能否修改屬性的值。默認值:true;
- [ [ Value ] ]:包含這個屬性的數(shù)據(jù)值。默認值:undefinded;
var person ={
name: "wang"
};
??這里創(chuàng)建了一個名為 name 的屬性,也就是說,[ [ Value ] ] 特性的值是"wang"。對值得任何修改都將反映在這個位置。
??要修改屬性默認的特性就要用到Object.defineProperty()方法。這個方法接受三個參數(shù):屬性所在的對象、屬性的名、一個描述符對象。
//writable使用
var person = {};
Object.defineProperty(person,"name",{
writable : false,
value : "wang"
});
alert(person.name); //wang
person.name = "huang";
alert(person.name); //wang
//configurable使用
var person = {};
Object.defineProperty(person,"name",{
configurable : false,
value : "wang"
});
alert(person.name); //wang
delete person.name ;
alert(person.name); //wang
?訪問器屬性:
?訪問器屬性不包含數(shù)據(jù)值;它們包含一對 getter 和 setter函數(shù)(這兩個函數(shù)都不是必須的)。在讀取訪問器屬性時,調(diào)用getter函數(shù),這個函數(shù)負責返回有效值。在寫入訪問器屬性時,調(diào)用setter函數(shù)并傳入新值,這個函數(shù)負責決定如何處理數(shù)據(jù)。訪問器屬性有四個特性。
- [ [ Configurable ] ]:表示能否通過 delete 刪除屬性。默認值:true;
- [ [ Enumerable ] ]:表示能否通過 for-in 循環(huán)返回屬性。默認值:true;
- [ [ Get ] ]:讀取屬性時調(diào)用的函數(shù)。默認值:undefined;
- [ [ Set ] ]:寫入屬性時調(diào)用的函數(shù)。默認值: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;
}
}
});
book.year = 2005;
alert(book.edition); //2
創(chuàng)建了一個book對象,并給它定義兩個默認屬性(_year和edition)。_year前面的下劃線是一種常用記號,用于表示只能通過對象方法訪問的屬性。而訪問器屬性year則包含一個getter函數(shù)和一個setter函數(shù)。getter函數(shù)返回_year的值,setter函數(shù)通過計算來確定正確的版本。因此year = 2005 會導致_year變成2005,而edition變成2.這是使用訪問器屬性的常見方式,即設置一個屬性的值會導致其他屬性發(fā)生變化。
不一定非要同時指定getter和setter。只指定getter會導致屬性不能寫入,嘗試寫入會被忽略。
1.2 定義多個屬性
??由于為對象定義多個屬性的可能性很大,ECMAScript5定義了一個object.defineProperties()方法。利用這個方法可以通過描述符一次定義多個屬性。
??這個方法接收兩個對象參數(shù):第一個對象是要添加和修改其屬性的對象,第二個對象的屬性與第一個對象中要添加或修改的屬性一一對應:
var book = {};
Object.defineProperties(book,{
_year:{
writable : true,
value:2004
},
edition:{
writable : ture,
value : 1
}
year:{
get:function(){
return this._year;
}
set:function(){
if (newValue > 2004) {
this._year = newValue;
this.edition += newValue - 2004 ;
}
}
}
});
這TM都是什么鬼東西?。浚。?!
1.3讀取屬性的特性
??使用Object.getOwnPropertyDescriptor()方法,可以去的給定屬性的描述符。兩個參數(shù):屬性所在的對象和要讀取其描述符的屬性名稱。返回值是一個對象。如果是數(shù)據(jù)屬性這個對象的屬性有那四個特性。如果是訪問器屬性這個對象的屬性也是那四個特性。
var book = {};
Object.defineProperties(book,{
_year:{
value:2004
},
edition:{
value : 1
},
year:{
get:function(){
return this._year;
},
set:function(){
if (newValue > 2004) {
this._year = newValue;
this.edition += newValue - 2004 ;
}
}
}
});
var descriptor = Object.getOwnPropertyDescriptor(book,"_year");
alert(descriptor); //2004
alert(descriptor.vonfigurable); //false
..........學不會,以后學!!!