在高程这本书里面,介绍了ECMA的两种属性:数据属性和访问器属性
两种属性包含的东西不再赘述和解释
只能通过对象方法访问的属性前缀为下划线(说实话真没看出来怎么就只能通过对象方法访问了)
例:
var book={
_year:2017,edition:1
};
Object.defineProperty(book,"year",{
get: function(){return this._year;},
set: function(newValue){
if(newValue>2017){
this._year=newValue;
this.edition+=newValue-2017;
}
}
});
console.log(book.year,book._year)//2017 2017
发现输出数据属性year和访问器属性_year都是可行的。
但是当对数据进行改变时,又会怎么样呢?我们预期是希望edition随着year更新。
book._year=2018;
console.log(book.year,book._year,book.edition)//2018 2018 1
book.year=2018;
console.log(book.year,book._year,book.edition)//2018 2018 2
可以看到通过访问器属性的set函数,edition按照我们所想那样变动了,省得自己再手动设置editon;而直接设置数据属性,则麻烦了点。
基本上,可以把访问器属性当作一个doorkeeper,它把形如_year等属性保护起来,你要找_year的时候,给访问器过目一下,他不但把你要找的东西给你找出来,还顺便给了你售后服务。这比你直接吆喝来丢三落四好多了是吧。
网友评论