面向对象--属性
对象的属性 分为 : 数据属性 以及 访问器属性.
1.数据属性
1.1 数据属性的特性
对象的每个普通属性都有四个特性 :
[ [ Configurable ] ] , [ [ Enumerable ] ] , [ [ Writable ] ] , [ [ Value ] ]
前三个的默认值都是true,最后的Value默认值是undefined
Configurable
为true时,表示:
①.该属性可以用delete操作符来 删除属性 从而重新定义属性.
②.该 属性的特性 可以被更改.
③.该属性可以被修改为 访问器属性(getter ,setter)
Enumerable
为true时,表示
①.该属性可以被for-in语句访问到.(in操作符应该也遵循此规律).
Writable
为true时,表示
①.该 属性的值 可以被修改.
Value
表示属性的值.当属性值读取时,在这个位置被读取;当设置属性值时,值会被设置在这里.
1.2 修改属性的特性
必须使用js提供的 Object.defineProperty(target, propertyName, descriptor);
target : 属性所在的对象
propertyName : 要修改的属性名称
descriptor : 表示属性的特性的对象
其中,descriptor 必须是如下格式 , 可以四个都配置,也可以省略其中的一部分不写.
{
configurable: true/false,
writable: true/false,
enumerable: true/false,
value: xxx
}
2.访问器属性
2.1 访问器属性的特性
每个访问器属性同样有四个特性:
[ [ Configurable ] ] , [ [ Enumerable ] ] , [ [ Set ] ] , [ [ Get ] ]
2.2 定义/修改 访问器属性
只能使用 Object.defineProperty(target,propertyName,descriptor);
例如:
var book = { _year: 2004, edition: 1 };
Object.defineProperty(book ,"year", {
get: function(){
return this._year ;
},
set: function(value){
if(value > 2004){
this.edition += value - this._year ;
this._year = value ;
}
}
});
book.year = 2005 ;
console.log(book.edition); // display 2
3.同时定义多个属性
使用 Object.defineProperties(target , props);
示例:
var book = {};
Object.defineProperties(book , {
_year : {
writable : true ,
value : 2004
},
edition : {
writable : true ,
value : 1
},
year : {
get : function(){
return this._year ;
},
set : function(value){
if(value > 2004){
this.edition += (value - this._year);
this._year = value ;
}
}
}
});
4.读取属性的特性
使用 Object.getOwnPropertyDescriptor( target , propertyName);
返回值是个 descriptor对象 , 包裹着对应的属性特性.
示例:
var desc = Object.getOwnPropertyDescriptor(book , "year") ;
console.log(desc.value , desc.configurable , typeof desc.get );
注: 本页中 所有的 Object.defineXxxxx() 函数 必须在 IE9+ 使用(包含IE9);