ECMAScript5(包括除IE以外的最新主浏览器的ECMAScript3的实现)
由getter 和 setter定义的属性称做“存取器属性”,它不同于“数据属性”:数据属性只有一个简单的值。
如果对象属性同时有getter和setter方法,它是一个读写属性。如果它只有getter方法,那么它是一个只读属性。如果它只有setter方法,那么它是一个只写属性,读取只写属性总是返回undefined。
定义存取器最简单的方法是使用直接量语法的一种扩展写法:
var o = {
data_prop:value,
getaccessor_prop(){ /*这里是函数体*/},
setaccessor_prop(value){ /*这里是函数体*/
}
和属性名同名的一个或两个函数,用逗号隔开的。例如下:
var p = {
x:1.0,
y:1.0 , //x和y普通的可读可写属性
get r(){
return Math.sqrt(this.x*this.x+this.y*this.y);
},
set r(newValue){
var oldvalue = Math.sqrt(this.x*this.x+this.y*this.y);
var ratio =newValue/oldvalue;
this.x*=ratio;
this.y*=ratio;
},
//theta是只读存取器属性,它只有getter方法
get theta(){return Math.atan2(this.y,this.x);}
}
和数据属性一样,存取器属性是可以继承的,因此可以将上述代码中的对象p当做另一个“点”的原型
var q = inherit(p);
q.x =1,q.y=1;
console.log(q.r) //使用继承的存取器属性
console.log(q.theta);