类类型接口
静态属性和静态方法
区分方法就是必须要有 new什么东西 完成什么类
第二种类类型接口 字面量类类型接口
接口继承
接口继承接口
继承多个接口
接口可以继承多个,但是类只能继承一个
接口不能继承对象
接口继承类,仅继承类中对于实例化属性和实例化方法描述,并不继承值和内容
如果接口需要继承某个类,要求类中的所有实例化属性和方法必须是共有public
所有属性的修饰符 public(共有) private(私有) protected(受保护)
如果希望这个属性和方法暴露给实例化对象(实例化对象可以调用则使用public),如果这个属性和方法在子类中
需要调用或者重新,就需要使用protected,如果这个属性和方法要求只能在当前类中调用,使用private
优先使用private,如果有继承并需要重写或者使用,可以修改为protected,当类写完后将实例化对象需要暴露
调用的才可以设置为public
// 实例化可以调用的方法和属性一般就属于暴露的属性和方法
// var b:Box=new Box();
// console.log(b.a);
// 类不需要使用public
类中方法是否需要返回值
禁止给构造函数设置返回类型,禁止在构造函数中使用return返回任何内容,可以使用return跳出
存取器定义时,setter不能设置返回类型,并且不能使用return返回任何值,必须设置一个参数
getter不能设置参数,必须设置返回值,尽量要求getter中的返回值和setter中参数类型完全一致
构造函数的修饰符
当构造函数设置为私有的时候,这个类就在这个类以外实例化
当构造函数设置为私有的时候,这个类也是不能被继承的
var b:Box=new Box();
console.log(b);
console.log(Box.getBox());
当构造函数设置为受保护的时候,这个类就可以被子类继承,并且在子类中设置共有的构造函数
在父类中设置的私有的方法和构造函数,在子类中无法重设为共有,但是受保护的可以在子类中修改为共有
单例模式
单例要求这个类只能创造一个实例化对象,并且这个实例化对象在任何地方都可以直接调用
普通类
为什么需要单例
// 下面案例中A类和B类中都有自身重新实例化的Box的对象,因此A类中和B类中box不是同一个,所以属性是不相同的
单例模式
// 下面的写法,每次调用get Instance就会new 一个新的实例化对象
下面的类中调用了相同的实例化对象
// 修饰符用于静态属性和方法
抽象类 抽象类一般用于基类,不能实例化
// 使用abstract定义类,这个类就是抽象类
// abstract class Box{
// public a:number=1;
// // 抽象属性,必须设置初始值
// // 抽象属性和抽象方法必须使用public或者protected来定义不能使用private
// public abstract b:number;
// constructor(){
// }
// public play():void
// {
// console.log("play");
// }
// // 抽象方法,不能设置方法的内容
// public abstract run():void;
// }
// interface IA{
// b:number;
// run():void;
// }
// 当类继承抽象类时,需要对于抽象类中的属性设定初始值,需要对于抽象类中抽象方法重新设置方法的内容
/*
一般来说,当定义的类只是作为基础类别,用于继承,并不是实际解决问题,这个类可以设置抽象类
抽象类的优点,在于抽象类可以理解为是类和接口的结合体,将共同都需要执行相同内容的属性和方法
设置为抽象类普通属性和方法,将需要子类具体实现的内容方法和属性设置为抽象属性和方法,由子类
具体自身去实现,这样不同的子类可以同一个方法实现不同的效果
接口内定义的属性和方法,在类中实现时一定是public
对象的属性映射
// var obj:{a:number,b:number}={a:1,b:2};
// for(var key in obj){
// // 不确定key是obj的属性名a或者b
// let k:keyof {a:number,b:number}=key as keyof {a:number,b:number}
// console.log(key,obj[k]);
// }
// keyof 接口 指这个属性就是接口的属性
// interface IO{
// a:number;
// b:number;