像是对属性的加密
比如
我一不小心,吧人的年龄改成了负数:
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)
