JavaScript使用getter和setter,通过使用get和set,我们可以在读取对象的属性(在get的情况下)或写入对象的属性(在set的情况下)时,运行特定代码。例如,可以用set来检查将要用来设置一个属性值的某些数据的有效性,或者用get返回一个计算的或特定格式的值。
如果为一个对象定义了get和set,在通过常规的点表示法来访问对象的属性和方法时,就会显式地调用它们。例如,假设在对象obj之上定义了如下的getter:
get name() {
return this.name.toUpperCase();
}
那么,当访问name的值时,这个getter将执行如下的代码:
obj.name = "Sandy";
console.log(obj.name); // 向控制台输出"SANDY"
当设置属性的值时,同样的原则也是适用的:如果已经用set关键字创建了一个setter,任何时候,一旦试图修改一个对象属性的这个值,将会在后台调用这个setter。
为了展示这一点,让我们回到Pet类。假设以任何新的值来作为一个宠物的名字时,想要通过代码将其名称的首字母大写,就可以用一个setter来做到这一点:
class Pet {
constructor(animal, name) {
this.animal = animal,
this.name = name
}
setAnimal(newAnimal) {
this.animal = newAnimal;
}
setName(newName) {
this.name = newName;
}
get name() {
return this._name;
}
set name(n) {
// 将第一个字母设置为大写,其他的字母保持小写
n = n.charAt(0).toUpperCase() + n.slice(1).toLowerCase();
this._name = n;
}
}
注意,在getter和setter中,name属性现在以一个下画线字符作为前缀,成了_name
。使用这个下画线是必需的,为了防止JavaScript解释器中的一种情况,即由于没有这一预防措施而导致get被重复调用,由此形成一个无限循环,并且最终导致程序因栈溢出而停止运行。实际上,要隐藏私有的、内部的属性值_name
,而允许外界访问name属性。
现在让我们来看看,在用如下这行代码创建并修改Pet类的一个实例时,将会发生什么:
var myCat = new Pet("cat", "sylvester");
控制台的输出如图所示:
getter和setter是在读取和写入一个对象的属性时自动运行代码的一种方便方法。使用它们,可以不允许直接给对象的属性赋值,而是通过一个setter方法来控制所有赋值,从而保证实际的对象属性是私有的。
注意:私有性是相对的
记住,这样的对象属性并不真正是私有的。代码(或者其他某人的代码)仍然能够直接访问myCat._name
的值。如果需要一个更加安全的私有属性,一种更好的方法是使用Symbol数据类型。
酷客网相关文章:
评论前必须登录!
注册