传统的JavaScript程序使用函数和基于原型的继承来创建可重用的组件,
 那么和es6一样的是class的继承和构造。
 但不同的是typescript又多了以下属性,模仿java,c#面向对象构建出来三个修饰符 public protected private:功能和java,c#基本一致,实现了面向对象式的发展。
class Box{
    public a:number=1;
    protected b:number=2;
    private c:number=3;
    public play():void{
        console.log(this.a);
        console.log(this.b);
        console.log(this.c);
        this.run();
        this.jump();
    }
    protected run():void{
    }
    private jump():void{
    }
}
var p = new Box();
公共,私有与受保护的修饰符public private protected
默认为public
| * | public | protected | private | * | 
|---|---|---|---|---|
| 实例化对象 | 可以调用 | 不可调用 | 不可调用 | public是对外暴露的 | 
| 在当前类中 | 可以调用 | 可以调用 | 可以调用 | |
| 继承后的子类中 | 可以调用 | 可以调用 | 不可调用 | 私有属性和方法不能在子类中调用 | 
| override父类方法 | 可以重写 | 可以重写 | 不可以重写 | |
| 接口继承类 | 可以继承 | 不可以继承 | 不可以继承 | 只有全部都是 public属性方法的类才可以被接口继承 | 
- 优先设定类中的属性和方法都是 - private(私有的)
- 当需要继承时,并且需要通过继承后进行调用和覆盖重新方法时,需要调用和覆盖的方法属性,在父类中改为 - protected受保护的
- 然后子类在调用这些方法属性时都使用 - protected(受保护的)
- 当需要将类中属性和方法暴露在外,实例化对象可以调用的,修改为public 设置为公有的 
可选参数
如果类中的属性设置类型并不包含undefined或者并不是可选属性,必须设置初始值,或者在构造函数中设置该值;
?:
可选属性
函数的参数中可以使用可选参数,必须写在必填参数后面,初始值参数可以放在可选参数后面
接口中可以使用可选参数
类中也可以使用可选参数
?.
当对象是一个可选属性时,调用对象的属性需要先判断这个对象是否赋值为对象了,还是undefined
 if(this.obj){
        this.obj.a=10;
    }
console.log(this.obj?.a)
可以将这种方式简略为 this.obj?.a
存取器
class Box{    
    private _step:number= 1;
    constructor(){
    }
    // 存取器中set方法不要设置返回类型,参数必须要设置类型
    public set step(value:number){
        this._step = value;
    }
     // 存取器中get方法必须要设置返回类型
    public get step(){
        return this._step;
    }
}
var b = new Box();
构造函数
构造函数不能设置返回值
 构造函数可以使用private和protected 设置,但是如果这样设置就无法在外面new这个构造函数了,
 (单例模式要用)
class Box{
   private constructor(){
    }
}
var b:Box=new Box();  //:Box  不能设置
静态属性和方法
静态属性可以不用设置初始值
 当调用静态属性和方法时,通知都是使用类名调用
 禁止在静态方法中使用this,虽然可以使用,但是这里强调大家不要使用,以防止和实例方法中this的区分
class Box{
   public static a:number;
   private static b:number;
   protected static c:number;
   public static play():void
   {
        // this.a
        // Box.a
   }
}
Box.play();
console.log(Box.a)
抽象类
这个抽象类是不能实例化的
 抽象类的作用是作为基类使用,用来继承的
 接口中是完全没有实现任何功能,只有方法名和属性名
 在抽象类实现了部分方法的功能,并且设置了一些类似接口的方法名和属性名
 在继承抽象类后,由个子类分别实现
abstract class Box{
    public a:number=1;
    public abstract update():void;
    public abstract b:number;
    public play():void
    {
        console.log("aaa")
    }
     protected run():void
    {
        console.log("bbb");
    }
}
class Ball extends Box{
    public b: number=1;
    public update(): void {
        
    }
}