像是对属性的加密
比如
我一不小心,吧人的年龄改成了负数:
class Person{
name:string;
age:number;
constructor(name:string,age:number){
this.name = name;
this.age = age;
}
}
const per = new Person('孙悟空',18);
per.name = '猪八戒';
per.age = -38;
console.log(per)
这样就等于在我们对象里面给我们埋下了安全隐患。
所以 属性可以任意的修改会导致对象中的数据变得非常不安全,尤其对一些敏感数据:比如**钱**
。这样的话在这里面算**是非常危险的**
我们怎么解决这个问题?
首先我们要解决第一个问题
能直接修改,说明,外面能直接看见。那我不希望外面能看见,不希望属性能任意的做修改,怎么办?
TS可以在属性面前添加属性的修饰符
class Person{
private name:string;
private age:number;
constructor(name:string,age:number){
this.name = name;
this.age = age;
}
}
- public: 公共的。修饰的属性可以在任意位置修改访问,默认值
- private:私有属性,私有属性只能在类内部进行修改
通过类中添加方法使得私有的属性可以被外部访问
class Person{
private name:string;
private age:number;
constructor(name:string,age:number){
this.name = name;
this.age = age;
}
//定义方法,用来获取name属性
getName(){
return this.name;
}
}
const per = new Person('孙悟空',18)
cosnole.log(per.getName())//间接的访问到了name
修改私有属性
class Person{
private name:string;
private age:number;
constructor(name:string,age:number){
this.name = name;
this.age = age;
}
//定义方法,用来获取name属性
getName(){
return this.name;
}
//定义方法,来设置name属性
setName(value:string){
this.name = value;
}
}
const per = new Person('孙悟空',18)
per.setName('猪八戒');//通过方法修改私有属性
cosnole.log(per.getName())//间接的访问到了name
- getter方法用来获取属性
- setter方法用来设置属性
**getter**
和**setter**
被称为**属性的存取器**
限制
class Person{
private name:string;
private age:number;
constructor(name:string,age:number){
this.name = name;
this.age = age;
}
//定义方法,用来获取name属性
getName(){
return this.name;
}
//定义方法,来设置name属性
setName(value:string){
this.name = value;
}
getAge(){
return this.age;
}
setAge(value:number){
if(vale >= 0){
this.age = value;
}
}
}
const per = new Person('孙悟空',18)
per.setName('猪八戒');//通过方法修改私有属性
cosnole.log(per.getName())//间接的访问到了name
但是我们修改的话get name、set name
其实有一点点麻烦,所以在
ts(js)
里面提供了一种更加灵活的方式
class Person{
private _name:string;
private _age:number;
constructor(name:string,age:number){
this.name = name;
this.age = age;
}
get name(){
return this._name;
}
}
const per = new Person('孙悟空',18)
//怎么使用get?
console.log(per.name)
我这里没有name
属性啊?,没有name
属性没有关系,有get name
这个时候注意:当我去.name
的时候,它并不是去找name
属性的,而是去调的我get name()
方法。这样的好处就是,它不会再去改变我们的使用习惯,用到了存取器。
同样set
:
class Person{
private _name:string;
private _age:number;
constructor(name:string,age:number){
this.name = name;
this.age = age;
}
get name(){
return this._name;
}
set name(value:string){
this._name = value;
}
}
const per = new Person('孙悟空',18)
per.name = '猪八戒';
//怎么使用get?
console.log(per.name)