如果有学过c#和java这类面向对象的语言的话就非常容易懂了

1、es5中类的定义

  1. function Person(){
  2. this.name = '张三';
  3. this.age = 20;
  4. this.info=function(){
  5. console.log( `我叫${this.name},今年${this.name}`);
  6. }
  7. }
  8. var p = new Person();
  9. p.name //张三
  10. p.info()

2、ts中的类定义

  1. class Person {
  2. name: string='李四';
  3. age: number = 20;
  4. constructor(message: string) {
  5. this.name = message;
  6. }
  7. info():void {
  8. console.log( `我叫${this.name},今年${this.name}`);
  9. }
  10. }
  11. let g2 = new Person('张三');
  12. console.log(g2.name);
  13. console.log(g2.info());

3、ts中类继承

  1. class Shape {
  2. Area:number
  3. constructor(a:number) {
  4. this.Area = a
  5. }
  6. }
  7. class Circle extends Shape {
  8. disp():void {
  9. console.log("圆的面积: "+this.Area)
  10. }
  11. }
  12. //实例中创建了 Shape 类,Circle 类继承了 Shape 类,Circle 类可以直接使用 Area 属性
  13. var obj = new Circle(223);
  14. obj.disp()

4、ts中的类重载

  1. class PrinterClass {
  2. doPrint():void {
  3. console.log("父类的 doPrint() 方法。")
  4. }
  5. }
  6. class StringPrinter extends PrinterClass {
  7. doPrint():void {
  8. super.doPrint() // 调用父类的函数
  9. console.log("子类的 doPrint()方法。")
  10. }
  11. }
  12. //类继承后,子类可以对父类的方法重新定义,这个过程称之为方法的重写。
  13. // 其中 super 关键字是对父类的直接引用,该关键字可以引用父类的属性和方法。

5、ts中类的多态

  1. // 父类定义一个方法不去实现,让继承他的派生类去实现,每一个派生类有不同的表现
  2. class Father {
  3. public age: number;
  4. constructor(age: number) {
  5. this.age = age
  6. }
  7. counts(): void {
  8. console.log(this.age)
  9. }
  10. }
  11. class children1 extends Father {
  12. constructor(age: number) {
  13. super(age)
  14. }
  15. counts(): void { /* 多态,重写方法不执行父类方法 */
  16. console.log(this.age - 1)
  17. }
  18. }
  19. class children2 extends Father {
  20. constructor(age: number) {
  21. super(age)
  22. }
  23. counts(): void {
  24. console.log(this.age + 1)
  25. }
  26. }

6、static关键字

  1. //static 关键字用于定义类的数据成员(属性和方法)为静态的,静态成员可以直接通过类名调用。
  2. class StaticMem {
  3. static num:number;
  4. static disp():void {
  5. console.log("num 值为 "+ StaticMem.num)
  6. }
  7. }
  8. StaticMem.num = 12 // 初始化静态变量
  9. StaticMem.disp() // 调用静态方法

7、访问控制修饰符

  1. // public(默认) : 公有,可以在任何地方被访问。
  2. // protected : 受保护,可以被其自身以及其子类和父类访问。
  3. // private : 私有,只能被其定义所在的类访问。
  4. // readonly :只读属性
  5. class Person {
  6. public name: string;
  7. // private name: string;
  8. // protected name: string;
  9. // readonly name: string;
  10. constructor(name: string) {
  11. this.name = name;
  12. }
  13. }
  14. class Man extends Person {
  15. private love: string;
  16. constructor(name: string, love: string) {
  17. super(name);
  18. this.love = love;
  19. }
  20. public say():void {
  21. // 如果Person 中用 private 修饰 name 则不能访问到 name 属性
  22. console.log(`my name is ${this.name}, and my love is ${this.love}`);
  23. }
  24. }
  25. let me = new Man('funlee', 'TS');
  26. me.name = 'new name'; // error

8、ts中的抽象类

  1. // 抽象类只能作为其他派生类的基类使用,抽象类不能被实例化
  2. // 抽象类可以包含成员的实现细节,且抽象类必须用 abstract 声明
  3. // 抽象类里不含方法体的方法称为抽象方法,使用 abstract 声明,抽象方法必须被派生类实现(抽象方法必须使用 abstract 关键字声明,且可以包含访问修饰符)
  4. abstract class Person { //抽象类
  5. public love: string;
  6. constructor(love: string) {
  7. this.love = love;
  8. }
  9. abstract sayLove(): string; // 必须在派生类中实现
  10. }
  11. class Woman extends Person{
  12. constructor(love: string){
  13. super(love)
  14. }
  15. sayLove():string {
  16. return `my love is ${this.love}`;
  17. }
  18. }
  19. let you = new Woman('TS');
  20. console.log(you.sayLove()); // my love is TS

9、类作为接口使用

  1. //类定义会创建两个东西:类的实例类型和一个构造函数,因为类可以创建出类型,所以能够在允许使用接口的地方使用类。
  2. class Person {
  3. name: string;
  4. age: number;
  5. constructor(name: string, age:number) {
  6. this.name = name;
  7. this.age = age;
  8. }
  9. }
  10. interface Jerry extends Person {
  11. love: string;
  12. }
  13. let he: Jerry = {
  14. name: 'jerry',
  15. age: 18,
  16. love: 'TS'
  17. }