高级程序设计(四)
面向对象:
1.对象的数据属性:Configureble:表示能否通过delete删除属性从而重新定义属性(delete person.name),Enumerable:表示能否通过for-in循环返回属性,Writable:表示能否修改属性值,Value:属性的数据值
var person={};
Object.defineProperty(person,"name",{writable:false,value="Ni"});
alert (person.name);//"Ni"
person.name="Gr";
alert(person.name);//"Ni";
一旦把属性定义成不可配置的,就不能再便会可配置的了
Object.defineProperty(person,"name",{writable:false,value="Ni",configurable:false});
Object.defineProperty(person,"name",{writable:false,value="Ni",configurable:true});//抛出错误
IE8只能在DOM对象上使用且限制,不要在IE8中使用Object.defineProperty()
2.访问器属性;Configurable:能否通过delete删除属性,Enumerable:能否通过for-in循环返回属性,get:读取属性时调用的函数,Set在写入属性时调用的函数
var book={_year:2014,edition:1};
Object.defineProperty(book,"year",{
get:function(){return this._year;},
set:function(newValue){
if (newValue>2014){this._year=newValue;this.edition+=newValue-2004;}
}
});
book.year=2005;
alert(book.edition);//2
严格模式下,尝试写入只指定了getter函数的属性会抛出错误;
3.定义多个属性:Object.defineProperties(); 支持的浏览器:IE9+,FF4+,Safari5+,Opera12+,Chrome
var book={};
Object.defineProperties(book,{
_year:{value:2004},
edition:{value:1},
year:{
get:function(){return this.year;},
set:function(newValue){
if(newValue){
this._year=newValue;
this.edition+=newValue-2004;}
}}});
4.读取属性的特性:Object.getOwnPropertyDescriptor()
访问器属性: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(newValue){
if(newValue){
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"