存取器属性的介绍
JavaScript对象的属性是由名字、值和一组特性组成。在ECMAScript中,属性值可以用一个或两个方法代替,这两个方法就是getter和setter。有getter和setter定义的属性称做“存取器属性(accessor property)”。普通的属性称做“数据属性(data proper同样)”,数据属性只有一个简单的值。
当程序查询存取器属性的值时,JavaScript调用getter方法(无参数)。这个方法的返回值就是属性存取表达式的值。当程序设置一个存取器属性的值是,JavaScript调用setter方法,讲赋值表达式右侧的值当做参数传入setter。从某种意义上讲,这个方法负责“设置”属性值。可以忽略setter方法的返回值。
和数据属性不同,存取器属性不具有可写性(writable attribute)。如果属性同时具有getter和setter方法,那么它是一个读/写属性。如果它只有getter方法,那么它是一个只读属性。如果它只有setter方法,那么它是一个只写属性。读取只写属性总是返回undefined。
存取器属性定义为一个或两个和属性同名的函数,这个函数定义没有使用function关键字,而是使用get和(或)set。注意这里没有使用冒号将属性名和函数体分隔开,但在函数体的结束和下一个方法或数据属性之间有逗号分隔。例如,下面这个表示笛卡尔点坐标的对象,它还有两个等价的存取器属性用来表示点的极坐标:
var p = {
x: 1.0,
y: 1.0,
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 radio = newvalue/oldvalue;
this.x *= radio;
this.y *= radio;
},
get theta() { return Math.atan2(this.y, this.x); }
}
在这段代码中,在函数体内的this指向表示这个点的对象。和数据属性一样,存取器属性是可以继承的。
存取器属性可以做什么
在segmentfault一个问答看到的两个例子:
- 在某个属性被设置时打印日志
set: function(pw) {
this.pw = pw;
console. log('密码被修改了');
}
- 在某个属性被设置时更新其他属性
set: function(a) {
this.a = a;
this.b = a * 100;
}
Vue的响应式原理也是通过setter,getter实现的:Vue官网-响应式原理
我的理解就是:当某个属性被更新,即当Vue实例中的data对象的某个属性被设置,通过setter更新其他属性,从而实现双向数据绑定。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。