关于访问器属性

 

要修改属性默认的特性,必须使用ECAMScript 5的 Object.defineProperty() 方法。
例如:

var person = {};
Object.defineProperty(
person,'name',{
writable:false,
value:'tom'
}
);
console.log(person.name);//tom
person.name = 'join';
console.log(person.name);//tom

 

这个例子创建了一个名为name的属性,他的值为tom是只读的。这个属性的值是不可以修改的,如果尝试为他指定新值,在非严格模式下,赋值操作将被忽略,在严格模式下,赋值操作将会导致抛出错误。
类似的规则也适用于不可配置的属性。例如:

var person = {};
Object.defineRroperty(person,'name',{
configurable:false,
value:'tom'
});
console.log(perso.name);//tom
delete person.name;//false
console.log(person.name);//tom

 

可以多次调用Object.defineProperty()方法修改同一个属性,但是把configurable特性设置为false之后就会有限制

调用这个方法的时候,如果不指定,configurable、enumerable 和writable特性的默认值都是false

访问器属性
访问器属性不包含数据值
他们包含一对getter和setter函数(不过,这两个函数都不是必须的)
在读取访问器属性的时候,会调用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(newValue){
if(newValue >2004){
this._year = newValue;
this.edition += newValue-2004

}
}
});
book.year = 2005;
console.log(book.edition);// 2

 

posted @ 2018-04-19 17:22  笨鱼你个酸菜猫  阅读(401)  评论(0编辑  收藏  举报