TypeScript类成员存取器

成员存取器由getset方法构成,并且会在类中声明一个属性。成员存取器的定义方式与对象字面量中属性存取器的定义方式是完全相同的。

如果一个类属性同时定义了get方法和set方法,那么get方法的返回值类型必须与set方法的参数类型一致,否则将产生错误。示例如下:

class C {
   /**
    * 正确
    */
   private _foo: number = 0;
   get foo(): number {
       return this._foo;
   }
   set foo(value: number) {}

   /**
    * 错误!'get' 和 'set' 存取器必须具有相同的类型
    */
   private _bar: string = '';
   get bar(): string {
       return this._bar;
   }
   set bar(value: number) {}
}

如果一个类属性同时定义了get方法和set方法,那么get方法和set方法必须具有相同的可访问性。例如,不允许将get方法定义为公有的,而将set方法定义为私有的。

下例中,foo属性的存取器方法均为私有的,bar属性的存取器方法均为公有的,因此它们是正确的;但baz属性的get方法是公有的,set方法是私有的,两者不一致会产生编译错误。

class C {
   /**
    * 正确
    */
   private _foo: number = 0;
   private get foo(): number {
       return this._foo;
   }
   private set foo(value) {}

   /**
    * 正确
    */
   private _bar: number = 0;
   public get bar(): number {
       return this._bar;
   }
   public set bar(value) {}

   /**
    * 错误!'get' 和 'set' 存取器具有不同的可见性
    */
   private _baz: number = 0;
   public get baz(): number {
       return this._baz;
   }
   private set baz(value) {}
}

存取器是实现数据封装的一种方式,它提供了一层额外的访问控制。类可以将成员变量的访问权限制在类内部,在类外部通过存取器方法来间接地访问成员变量。在存取器方法中,还可以加入额外的访问控制等处理逻辑。示例如下:

class Circle {
   private _radius: number = 0;
   get radius(): number {
       return this._radius;
   }
   set radius(value: number) {
       if (value >= 0) {
           this._radius = value;
       }
   }
}

const circle = new Circle();
circle.radius; // 0

circle.radius = -1;
circle.radius; // 0

circle.radius = 10;
circle.radius; // 10

这里定义了radius存取器,它用来控制对私有成员变量_radius的访问。

在一些编程语言中,_radius成员变量也称为“backing field”。第3行,在get方法中我们直接返回了_radius的值。第6行,在set方法中会检查传入的值大于0时才赋值给_radius

酷客网相关文章:

赞(0)

评论 抢沙发

评论前必须登录!