属性的修饰符

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

public

public修饰的属性可以在任意位置访问(修改)默认值

  1. class Person{
  2. // TS可以在属性前添加属性的修饰符
  3. //
  4. public _name:string;
  5. public _age:number;
  6. constructor(name:string,age:number){
  7. this._name = name;
  8. this._age = age;
  9. }
  10. }
  11. const per = new Person('name1',18);
  12. console.log(per);
  13. // 现在属性是在对象中设置的,属性可以任意被修改
  14. // 属性可以任意被修改,将会导致对象中的数据变得非常不安全
  15. per._name = 'name2';
  16. per._age = 19;
  17. console.log(per);
  1. class A{
  2. public num:number;
  3. constructor(num:number){
  4. this.num = num;
  5. }
  6. }
  7. class B extends A{
  8. test(){
  9. console.log(this.num);
  10. }
  11. }

private

私有属性,只能在类内部进行访问(修改),而且是当前类中访问
通过在类中添加方法使得私有属性可以被外部访问

  1. class Person{
  2. // TS可以在属性前添加属性的修饰符
  3. //
  4. private _name:string;
  5. private _age:number;
  6. constructor(name:string,age:number){
  7. this._name = name;
  8. this._age = age;
  9. }
  10. }
  11. const per = new Person('name1',18);
  12. console.log(per);
  13. // 现在属性是在对象中设置的,属性可以任意被修改
  14. // 属性可以任意被修改,将会导致对象中的数据变得非常不安全
  15. per._name = 'name2';
  16. per._age = 19;
  17. console.log(per);
  1. class A{
  2. private num:number;
  3. constructor(num:number){
  4. this.num = num;
  5. }
  6. }
  7. class B extends A{
  8. test(){
  9. console.log(this.num);
  10. }
  11. }

虽然B继承了A,但是还是不能访问A的私有属性

protected

受保护的属性,只能在当前类和当前类的子类中使用

  1. class A{
  2. protected num:number;
  3. constructor(num:number){
  4. this.num = num;
  5. }
  6. }
  7. class B extends A{
  8. test(){
  9. console.log(this.num);
  10. }
  11. }
  12. const b = new B(123);
  13. b.num = 33;

这里的b.num是无法访问的,因为num受保护,只能在类中访问


getter方法

**定义方法,用来获取name属性

  1. class Person{
  2. // TS可以在属性前添加属性的修饰符
  3. //
  4. private _name:string;
  5. private _age:number;
  6. constructor(name:string,age:number){
  7. this._name = name;
  8. this._age = age;
  9. }
  10. getName(){
  11. return this._name;
  12. }
  13. }
  14. const per = new Person('name1',18)
  15. console.log(per.getName());

setter方法

定义方法,用来设置name属性

  1. class Person{
  2. // TS可以在属性前添加属性的修饰符
  3. //
  4. private _name:string;
  5. private _age:number;
  6. constructor(name:string,age:number){
  7. this._name = name;
  8. this._age = age;
  9. }
  10. // 定义方法,用来获取name属性
  11. getName(){
  12. return this._name;
  13. }
  14. // 定义方法,用来设置name属性
  15. setName(value:string){
  16. this._name = value;
  17. }
  18. getAge(){
  19. return this._age;
  20. }
  21. setAge(value:number){
  22. // 判断年龄是否合法
  23. if(value>=0){
  24. this._age = value;
  25. }
  26. }
  27. }
  28. const per = new Person('name1',18)
  29. per.setName('name2');
  30. per.setAge(-33);
  31. console.log(per);
  • getter方法用来读取属性
  • setter方法用来设置属性

他们被称为属性的存取器


Ts中设置getter、setter方法的方式

  1. class Person{
  2. // TS可以在属性前添加属性的修饰符
  3. //
  4. private _name:string;
  5. private _age:number;
  6. constructor(name:string,age:number){
  7. this._name = name;
  8. this._age = age;
  9. }
  10. //Ts中设置getter方法的方式
  11. get name(){
  12. return this._name;
  13. }
  14. set name(value){
  15. this._name = value;
  16. }
  17. get age(){
  18. return this._age;
  19. }
  20. set age(value){
  21. if(value>=0){
  22. this._age = value;
  23. }
  24. }
  25. }
  26. const per = new Person('name1',18)
  27. per.name = 'name2';
  28. per.age = -33;
  29. console.log(per.name);

class C{
  // 可以直接将属性定义在构造函数中
  constructor(public name:string,public age:number)
}
const c = new C('name1',11);
class C{
  name:string;
  age:number;
  constructor(name:string,age:number){
    this.name = name;
    this.age = age;
  }
}

上面两种写法是等价的,前面的更加简洁,属于语法糖