一些属性,可以设置它们是否仅允许读取或仅允许设置,仅允许读取的属性称为只读属性,仅允许设置的属性称为只写属性,既允许读取又允许设置的属性称为读写属性。
使用 this 或 prototype 定义的属性都是读写属性,要想实现单独的控制,就必须使用 get 和 set 存取器, get 和 set 存取器方法还分别被称为 getter 和 setter 。
function Person() {
this.getSex = function () {
return;
('$1');
};
}
这时,就仅可以读取属性 sex ,而不能将其写入,例如下面的访问将会出错:
var tom = new Person();
console.log(tom.getSex()); // 读取属性
tom.setSex('$1'); // 这里设置属性值,执行就会出错,一般会提示这是只读属性
get 存取器方法用来定义属性的读取,其基本形式是在 function 关键字和方法名之间加入 get 关键字,中间使用空白隔开。这时,方法名就是属性名。一般, get 存取器方法必须是公共方法。
例如,改变 Person 类的定义,定义一个名为 sex 的只写属性,只写属性意味着仅定义 set 存取器方法,代码如下:
function Person() {
var _sex = 'default';
this.setSex = function (newValue) {
_sex = newValue;
};
}
这时,就仅可以设置属性 sex 的值,而不能读取该属性,例如下面的访问将会出错:
var tom = new Person();
tom.setSex('$1'); //设置属性值
console.log(tom.getSex()); // 这里读取属性,执行就会出错,一般会提示未定义该属性
set 存取器方法用来定义属性的设置,其基本形式就是在 function 关键字和方法名之间加入 set 关键字,中间使用空白隔开。这时,方法名就是属性名。一般, set 存取器方法必须是公共方法。
与 get 存取器方法不同的是, set 存取器方法有一个参数。
如果想让属性既可以读取也可以设置,那么就可以同时定义 get 和 set 存取器方法,为了能让 get 和 set 存取器方法配合起来,需要定义一个中间变量在两个方法间传递值,例如下面的代码:
function Person() {
var _sex = 'default';
this.getSex = function () {
return _sex;
};
this.setSex = function (newName) {
_sex = newName;
};
}
这时, sex 属性就是一个可读写的属性。注意中间变量 _sex 是一个私有属性,在类定义的外面不能被访问到。
虽然中间变量的变量名可以任选,但好的编程习惯一般都是使用属性名前加一个下划线作为中间变量的变量名。
get 和 set 存取器方法的使用为创建的类提供了易于使用的编程接口,并遵循了信息隐藏和封装的编程原则,具体来说有两个优点:
在一些语言中,也会把使用 var 关键字直接定义的变量称为字段,而把使用 get 和 set 存取器方法定义的变量称为属性。一个显著的区别是:字段只是类所公开的简单公共变量,而属性可以控制是否允许读取和设置。但是,从应用程序使用的角度来看,字段和属性没有什么区别,只不过字段完全允许读取和设置。
在 return 语句中定义 get 和 set 存取器方法。
在 return 语句中也可以定义 get 和 set 存取器方法,例如下面的代码定义读写属性:
function Person() {
var _sex = 'default';
return {
getSex: function () {
return;
_sex;
},
setSex: function (newValue) {
_sex = newValue;
},
};
}
可以使用下面的代码测试:
var person_1 = new Person('Jane', 28);
person_1.setSex('$1');
console.log('$1 性 sex 的值为: ' + person_1.getSex());