標籤:
/**
* Created by Administrator on 2015/7/20 0020.
*/
//物件導向(oo):通過類可以建立任意多個具有相同屬性和方法對象
//js把對象定義為:無序屬性的集合,其屬性可以包含基本值,對象或者函數,嚴格來說,就相當於說
對象是一組沒有特定順序值,對象的每個屬性或者方法都有一個名字,而每個名字都映射到一個值
//理解對象
//建立一個對象執行個體
var peson=new Object();
peson.name=‘Nichols‘;
peson.age=29;
peson.job=‘Software Engineer‘;
peson.sayName=function(){
alert(this.name)
};
//建立一個名為peson對象,並添加幾個屬性.name,.age,.job,和一個方法.sayName
//sayName()方法用於顯示this.name的值,現在通過以下代碼方式
var peson={
name:‘Nichols‘,
age:29,
job:‘Software Engineer‘,
sayName:function(){
alert(this.name);
}
};
//屬性類型:資料屬性和訪問器屬性
/*資料屬性
* 包含一個資料值的位置,在這個位置可讀可寫,有4個描述行為
* [Configurable]:表示能否通過delete刪除屬性從而重新定義屬性,能否修改屬性的特性,或者能
否把屬性修改為訪問器屬性,預設值為true
* [Enumerable]:表示能否通過for-in迴圈返回屬性,預設值為true
* [Writable]:表示能否修改屬性,預設值為true
* [Value]:包含這個屬性的資料值,讀取屬性的值時候,從這個位置讀;寫入屬性值的時候,把新值
儲存在這個位置,預設值為undefined*/
var peson={
name:‘Nichols‘
};
//建立一個名為name屬性,為它指定值:Nichols,也就是說:[value]特性將被設定為Nichols,而對
這個值任何修改都將反映在這個位置
//要修改預設特性:Object.defineProperty()方法,它接受3個參數:屬性所在對象,名字,和一個描
述符對象
//描述符(descriptor)對象屬性必須是configurable,emumerable,writable的value,設定其中一個或
者多個值,可以修改對應特性值,如
//var peson={};
//Object.defineProperty(peson,‘Name‘,{writable:false,
//value:‘Nichols‘});//建立一個name屬性,它的值是Nichols唯讀,不可修改的
//alert(peson.name);//undefined
//peson.name=‘Greg‘;
//alert(peson.name);//Greg
//也可以使用如下規則(不修改屬性)
var peson={};
Object.defineProperty(peson,‘Name‘,{configurable:false,
value:‘Nichols‘});
//alert(peson.name);//undefined
//peson.name=‘Greg‘;
//alert(peson.name);//Greg
//configurable:false,表示不能從對象中刪除屬性,如果對這個屬性調用delete,則在strict 模式下什
麼都不會發生,在strict 模式下會導致錯誤
Object.defineProperty(peson,‘Name‘,{configurable:true,
value:‘Nichols‘});//這樣修改,會導致錯誤
//Object.defineProperty()方法修改同個屬性,但在把configurable為false之後有限制了
//在調用Object.defineProperty()方法,如果不指定,configurable、enumerable和writable特性默
認值都是false,多數情況下,
//Object.defineProperty()方法方法提供了這些進階特性
//訪問器屬性
/*訪問屬性不包含資料值,它們包含一對兒getter和setter函數(但這2個屬性都不是必需的)
* 在讀取存取器屬性時,會調用getter屬性,這個函數負責返回有效值,在寫入訪問屬性時,會調用
setter函數並傳入新值,如何處理屬性,如下
* [Configurable]:表示能否通過delete刪除屬性從而重新定義屬性,能否修改屬性的特性,或者能
否把屬性修改為訪問器屬性,預設值為true
* [Enumerable]:表示能否通過for-in迴圈返回屬性,預設值為true
* [get]在讀取屬性時調用函數,預設為undefined
* [set]在寫入屬性時調用函數,預設為undefined
* */
//訪問在器屬性不能直接定義,需要使用Object.defineProperty()定義,如下
var book={_year:2004,edition:1};
Object.defineProperty(book,‘year‘,{get:function(){
return this._year
},
set:function(
value
){if(value>200){
this._year=value;
this.edition+=value-2004
}}
});
//book.year=2005;
//alert(book.edition);
//建立一個對象名為book對象,定義了2個預設屬性:_year和edition;
//_year前面的底線是一種常用記號,用於表示只能通過對象方法訪問屬性,而訪問器屬性year則包
含一個getter和setter函數
//getter函數返回_year值,setter函數通過睞確定正確的版本,把
//year的值改為2005,那麼_year也將變成2005,edition變成2,這個就是常用的訪問器屬性
/*不一定非要同時指定getter和setter,只指定getter意味著屬性不能寫,嘗試寫入屬性會被忽略
* 在嚴格栻上,寫入只指定了getter函數會出現錯誤,類似的setter屬性也不能讀取
* 要建立訪問屬性,一般用2個非標準方法
* __definGetter__()和__defineSetter__(),例子*/
var book={_year:2004,edition:1};
//定義訪問器舊有屬性
book.__defineGetter__(‘year‘,function(){
return this._year;
});
book.__defineSetter__(‘year‘,function(value){
if(value>2004){
this._year=value;
this.edition+=value-2004
}
});
book.year=2005;
alert(book.edition);
//定義多個屬性
//Object.defineProperties():可以定義多個屬性,接受2個參數:第一個對象是要添加和修改屬性的
對象,第二個對象的屬性與第一個對象中添加或者修改屬性一一對應,如下
var book={};
Object.defineProperties(book,{
_year:{
value:2004
},edition:{
value:1
},year:{
get:function(){
return this._year
},
set:function(value){
if(value>2004){
this._year=value;
this.edition+=value-2004
}
}
}
});
//讀取屬性的特性,Object.defineProperties()方法,可以取得給定屬性的描述符,它接受2個參數:
所在在對象和要讀取描述秘名稱,傳回值是一個對象,如果是訪問器屬性,這個對象有
//configurable,enumerable,get,set
//如果是資料屬性,這個對象configurable,enumerable,writable和value,如下
var book={};
Object.defineProperties(book,{
_year:{
value:2004
},edition:{
value:1
},year:{
get:function(){
return this._year
},
set:function(value){
if(value>2004){
this._year=value;
this.edition+=value-2004
}
}
}
});
var descript=Object.getOwnPropertyDescriptor(book,‘_year‘);
alert(descript.value);//2004
alert(descript.configurable);//false
alert(typeof descript.get);//‘undefined‘
var descripts=Object.getOwnPropertyDescriptor(book,‘year‘);
alert(descripts.value);//undefined
alert(descripts.enumerable);//false
alert(typeof descripts.get);//‘function‘
javascript第3版(進階程式設計)第6章:物件導向的程式設計