像是对属性的加密

比如

我一不小心,吧人的年龄改成了负数:

  1. class Person{
  2. name:string;
  3. age:number;
  4. constructor(name:string,age:number){
  5. this.name = name;
  6. this.age = age;
  7. }
  8. }
  9. const per = new Person('孙悟空',18);
  10. per.name = '猪八戒';
  11. per.age = -38;
  12. console.log(per)

这样就等于在我们对象里面给我们埋下了安全隐患。

所以 属性可以任意的修改会导致对象中的数据变得非常不安全,尤其对一些敏感数据:比如**钱**。这样的话在这里面算**是非常危险的**

我们怎么解决这个问题?

首先我们要解决第一个问题

能直接修改,说明,外面能直接看见。那我不希望外面能看见,不希望属性能任意的做修改,怎么办?

TS可以在属性面前添加属性的修饰符

  1. class Person{
  2. private name:string;
  3. private age:number;
  4. constructor(name:string,age:number){
  5. this.name = name;
  6. this.age = age;
  7. }
  8. }
  • public: 公共的。修饰的属性可以在任意位置修改访问,默认值
  • private:私有属性,私有属性只能在类内部进行修改

通过类中添加方法使得私有的属性可以被外部访问

  1. class Person{
  2. private name:string;
  3. private age:number;
  4. constructor(name:string,age:number){
  5. this.name = name;
  6. this.age = age;
  7. }
  8. //定义方法,用来获取name属性
  9. getName(){
  10. return this.name;
  11. }
  12. }
  13. const per = new Person('孙悟空',18)
  14. cosnole.log(per.getName())//间接的访问到了name

修改私有属性

  1. class Person{
  2. private name:string;
  3. private age:number;
  4. constructor(name:string,age:number){
  5. this.name = name;
  6. this.age = age;
  7. }
  8. //定义方法,用来获取name属性
  9. getName(){
  10. return this.name;
  11. }
  12. //定义方法,来设置name属性
  13. setName(value:string){
  14. this.name = value;
  15. }
  16. }
  17. const per = new Person('孙悟空',18)
  18. per.setName('猪八戒');//通过方法修改私有属性
  19. cosnole.log(per.getName())//间接的访问到了name
  • getter方法用来获取属性
  • setter方法用来设置属性

**getter****setter**被称为**属性的存取器**

限制

  1. class Person{
  2. private name:string;
  3. private age:number;
  4. constructor(name:string,age:number){
  5. this.name = name;
  6. this.age = age;
  7. }
  8. //定义方法,用来获取name属性
  9. getName(){
  10. return this.name;
  11. }
  12. //定义方法,来设置name属性
  13. setName(value:string){
  14. this.name = value;
  15. }
  16. getAge(){
  17. return this.age;
  18. }
  19. setAge(value:number){
  20. if(vale >= 0){
  21. this.age = value;
  22. }
  23. }
  24. }
  25. const per = new Person('孙悟空',18)
  26. per.setName('猪八戒');//通过方法修改私有属性
  27. cosnole.log(per.getName())//间接的访问到了name

但是我们修改的话get name、set name其实有一点点麻烦,所以在

ts(js)里面提供了一种更加灵活的方式

  1. class Person{
  2. private _name:string;
  3. private _age:number;
  4. constructor(name:string,age:number){
  5. this.name = name;
  6. this.age = age;
  7. }
  8. get name(){
  9. return this._name;
  10. }
  11. }
  12. const per = new Person('孙悟空',18)
  13. //怎么使用get?
  14. console.log(per.name)

我这里没有name属性啊?,没有name属性没有关系,有get name这个时候注意:当我去.name的时候,它并不是去找name属性的,而是去调的我get name()方法。这样的好处就是,它不会再去改变我们的使用习惯,用到了存取器。

同样set:
  1. class Person{
  2. private _name:string;
  3. private _age:number;
  4. constructor(name:string,age:number){
  5. this.name = name;
  6. this.age = age;
  7. }
  8. get name(){
  9. return this._name;
  10. }
  11. set name(value:string){
  12. this._name = value;
  13. }
  14. }
  15. const per = new Person('孙悟空',18)
  16. per.name = '猪八戒';
  17. //怎么使用get?
  18. console.log(per.name)