public 修饰的属性或方法是公有的,可以在任何地方被访问到,默认所有的属性和方法都是 public 的。

private 修饰的属性或方法是私有的,不能在声明它的类的外部访问,在子类中也不能访问到。

protected修饰的属性或方法是受保护的,它和 private 类似,区别是它在子类中也是允许被访问的。

readonly
abstract

用于定义抽象类和其中的抽象方法。

  • 抽象类是不允许被实例化的
abstract  class  Animal {
  public  name;
  public  constructor(name) {
    this.name  =  name;
  }
  public  abstract  sayHi();
}
let  a  =  new  Animal('Jack'); // 报错
  • 抽象类中的抽象方法必须被子类实现
abstract  class  Animal {
  public  name;
  public  constructor(name) {
  this.name  =  name;
  }
  public  abstract  sayHi();
}
class  Cat  extends  Animal {
  public  sayHi() {
  console.log(`Meow, My name is ${this.name}`);
  }
}
let  cat  =  new  Cat('Tom');

接口

把特性提取成接口(interfaces),用 implements 关键字来实现。这个特性大大提高了面向对象的灵活性。

interface  Alarm {
  alert();
}
class  Door {
}
class  SecurityDoor  extends  Door  implements  Alarm {
  alert() {
  console.log('SecurityDoor alert');
  }
}
class  Car  implements  Alarm {
  alert() {
    console.log('Car alert');
  }
}

门是一个类,防盗门是门的子类。防盗门有一个报警器的功能,把报警器提取出来,作为一个接口。

  • 一个类可以实现多个接口
interface  Alarm {
  alert();
}
interface  Light {
  lightOn();
  lightOff();
}
class  Car  implements  Alarm, Light {
  alert() {
    console.log('Car alert');
  }
  lightOn() {
    console.log('Car light on');
  }
  lightOff() {
    console.log('Car light off');
  }
}

上例中,Car 实现了 AlarmLight 接口,既能报警,也能开关车灯。

  • 接口继承接口

接口与接口之间可以是继承关系。

interface  Alarm  {
  alert();
}
interface  LightableAlarm  extends  Alarm  {
  lightOn();
  lightOff();
}
  • 接口也可以继承类
class  Point  {
  x:  number;
  y:  number;
}
interface  Point3d  extends  Point  {
  z:  number;
}
let point3d: Point3d =  {x:  1, y:  2, z:  3};
  • 混合类型

可以使用接口的方式来定义一个函数需要符合的形状

interface  SearchFunc  {
  (source:  string, subString:  string):  boolean;
}
let mySearch: SearchFunc;
mySearch  =  function(source:  string, subString:  string)  {
  return source.search(subString)  !==  -1;
}

dabaiaijianshen
18 声望6 粉丝