2016年10月19日
TypeScript-深入理解set与get的存取机制
各位老哥坐稳了 咱们现在就发车,
我们先来看看set和get这两个词的表面意思,set是设置的意思,而get是获取的意思,顾名思义,这两个方法是对数据进行设置和获取用的。而且,在类中使用set和get方法时,都是在set和get后面跟上一些特定的词来形成特定意思的方法名,比如setage()和getage(),表示设置年龄和获取年龄。
typescript面向对象编程中的封闭性和安全性。
封闭性即对类中的域变量进行封闭操作,即用private来修饰他们,如此一来其他类则不能对该变量访问。
这样我们就将这些变量封闭在了类内部,这样就提高了数据的安全性,当我们想要操作这些域变量怎么办呢?
我们可以通过两种方法,第一中即通过public方式的构造器(或称构造函数),对象一实例化就对该变量赋值。第二种就是通过上面提到的set和get方法,这里我举一个特定的例子
存取器
TypeScript中的存取器就类似与java中set和get方法,只不过调用的方式不一样。比如在一个类中我们将其中一个属性用private修饰,那么,在类的外部就无法访问到该属性,这个时候我们可以通过getters/setters来封装一下,以便在类的外部去访问该属性。需要注意的是,只带有 get不带有set的存取器自动被推断为readonly。也就是说,如果只写get但没有set的话,我们是不能更改值的。
/*存取器*/
class Person {
private _age: number;
/*相当于java中的getAge()*/
get age() {
return this._age;
}
/*相当于java中的setAge()*/
set age(inputAge: number) {
/*这里可以做一些逻辑处理 */
if (inputAge < 0 || inputAge > 150) {
alert("年龄异常");
} else {
this._age = inputAge;
}
}
say() {
console.log(`i'm ${this._age} years old`);
}
}
let p = new Person();
//p._age=23;//错误,这里访问不到
p.age = 23;//这里相当于调用java中的setAge()方法。
p.say();
这样一来,我不用直接对Person类中的域变量操作,
而是通过set和get方法间接地操作这些变量,这样就能提高域变量的安全性,同时又保证了域变量的封装型。
最后说说set和get方法的使用场景,一般来说set和get方法都是对私有域变量进行操作的,所以大多数都是使用在包含特定属性的类实体中。
如果有问题欢迎与我沟通!