zoukankan      html  css  js  c++  java
  • 03、TypeScript 中的类

    1.首先了解 es5 中的类的实现与继承

    // es5 中的类
    function Persion(name, age) {
      this.name = name;// 属性
      this.age = age;
      this.run = function () {// 实例方法,必须 new 这个实例之后才能调用
        console.log(this.name + '运动');
      }
    }
    
    // 原型链上的属性会被多个实例共享,构造函数不会
    Persion.prototype.sex = '男';// 原型链扩展属性
    Persion.prototype.work = function () {
      console.log('工作');
    }
    Persion.getInfo = function () {
      console.log('我是静态方法');
    }
    
    
    var p = new Persion('zhangning', 24);
    console.log(p.name);// zhangning
    p.run();// 执行方法
    p.work();// 调用原型链上的方法
    Persion.getInfo();// 调用静态方法
    
    // 1.对象冒充实现继承
    // es5 继承,定义一个 Web 类 继承 Persion 类
    function Web() {
      Persion.call(this);
    }
    
    var w = new Web();
    w.run();// run 方法继承自Persion,对象冒充可以继承构造函数里面的属性和方法
    w.work();// 报错,对象冒充不能继承原型链上面的属性和方法
    
    // 2.原型链实现继承
    function Web1() {
    }
    
    // 原型链继承既可以继承构造函数中的属性和方法,又可以继承原型链上的属性和方法
    Web.prototype = new Persion();
    var w1 = new Web1('zhangning', 24);
    // 有个问题,就是实例化子类的时候没办法给父类传参,w1.run() 方法会报错
    w1.run();
    w1.work();
    
    // 3.原型链 + 构造函数的组合继承模式
    function Web1(name, age) {
      Persion.call(this, name, age);
    }
    
    // 原型链继承既可以继承构造函数中的属性和方法,又可以继承原型链上的属性和方法
    Web.prototype = new Persion();
    // Web.prototype = Persion.prototype; // 这种也可以
    // 这里就解决了实例化子类不能给父类传参的问题
    var w1 = new Web1('zhangning', 24);
    w1.run();
    w1.work();

    2. TypeScript 中定义类

    // 1.ts 中 class 定义类
    class Persion {
      name: string;// 属性,省略了 public
      constructor(name: string) {// 构造函数,实例化类的时候,触发的方法
        this.name = name
      }
    
      run(): void {
        console.log(this.name);
      }
    
      getName(): string {
        return this.name;
      }
    
      setName(name: string): void {
        this.name = name
      }
    }
    
    // 实例化
    var p = new Persion('zhangning');
    p.run();
    console.log(p.getName());// zhangning
    p.setName('zhangning187')
    console.log(p.getName());// zhangning187

    3.TypeScript 中实现继承

    // 2.ts 中实现继承 extends super
    class Persion {
      name: string;
    
      constructor(name: string) {
        this.name = name
      }
    
      run(): void {
        console.log(this.name);
      }
    
      getName(): string {
        return this.name;
      }
    }
    
    // 实例化
    var p = new Persion('zhangning');
    p.run();
    
    class Web extends Persion {
      constructor(name: string) {
        super(name);
      }
    
      work(): void {
        console.log('工作');
      }
    
      // 方法的重写
      run(): void {
        console.log(111);
      }
    }
    
    var w = new Web('zhangning187');
    w.run();// zhangning187

    4.TypeScript 类里面的修饰符

    // 3.类里面的修饰符
    // public:公有(默认值),在类里面,子类,类外面都可以访问
    // protected:保护类型 在类里面,子类里面可以访问,类外部没法访问
    // private:私有 在类里面可以访问,子类,类外部没法访问
    class Persion {
      public name: string;// 默认就是 public
      protected age: number;
      private sex: string;
    
      constructor(name: string, age: number, sex: string) {
        this.name = name
        this.age = age
        this.sex = sex
      }
    
      run(): void {
        console.log(this.name);
      }
    
      getName(): string {
        return this.name;
      }
    }
    
    // 实例化
    var p = new Persion('zhangning', 24, '男');
    p.run();
    console.log(p.name);// name 可以访问
    // console.log(p.age);// 报错,age 不可以访问,类外部访问不了保护类型的属性
    // console.log(p.sex);// 报错,sex 不可以访问,类外部访问不了私有类型的属性
    
    class Web extends Persion {
      constructor(name: string, age: number = 23, sex: string = '男') {
        super(name, age, sex);
      }
    
      work(): void {
        console.log('工作');
        // console.log(this.sex);// sex 是私有属性,在子类中访问不了
      }
    
      // 方法的重写
      run(): void {
        console.log(111);
      }
    }
    
    var w = new Web('zhangning187');
    w.run();// zhangning187

    5.类中的静态属性、静态方法

    // 类中的 静态属性 静态方法
    class Persion {
      public name: string;// 默认就是 public
      protected age: number;
    
      static sex = '男'
    
      constructor(name: string, age: number) {
        this.name = name
        this.age = age
      }
    
      // 实例方法
      run(): void {
        console.log(this.name);
      }
    
      // 静态方法,静态方法里面没法直接调用类里面的属性,只能调用静态属性
      static run1(): void {
        console.log(this.sex);
      }
    }
    
    console.log(Persion.sex);// 调用静态属性
    Persion.run1();// 调用静态方法

    6.多态

    // 多态:父类中定义一个方法不去实现,让继承它的子类去实现,每一个子类有不同的表现
    // 多态属于继承
    class Animal {
      name: string;
    
      constructor(name: string) {
        this.name = name
      }
    
      // 实例方法
      eat(): void {
        console.log('吃的方法');// 具体吃什么,让它的子类去实现,这就是多态
      }
    }
    
    class Dog extends Animal {
      constructor(name: string) {
        super(name);
      }
    
      eat(): void {
        console.log('小狗吃骨头');
      }
    }
    
    class Cat extends Animal {
      constructor(name: string) {
        super(name);
      }
    
      eat(): void {
        console.log('吃老鼠');
      }
    }

    7.抽象类

    // TypeScript 这种的抽象类:是提供其他类继承的基类,不能直接被实例化
    // 用 abstract 关键字定义抽象类和抽象方法,抽象类中的抽象方法不包含具体实现并且必须在派生类中实现
    // 抽象类抽象方法用来定义标准,标准: Animal 这个类要求它的子类必须包含 eat 方法
    abstract class Animal {// 定义抽象类,必须包含一个抽象方法,不然就没有任何意义了
      name: string;
    
      constructor(name: string) {
        this.name = name
      }
    
      // 定义抽象方法,抽象方法只能出现在抽象类里面,必须在子类中实现
      abstract eat(): void;
    
      run(): void {
        console.log('跑得快');
      }
    }
    
    // var a = new Animal();// 错误的写法,抽象类不能直接实例化
    
    // 抽象类的子类必须实现抽象类里面的抽象方法
    class Dog extends Animal {
      constructor(name: string) {
        super(name);
      }
    
      eat(): void {
        console.log('小狗吃骨头');
      }
    }
    
    var dog = new Dog('小黑');
    dog.eat();
    
    class Cat extends Animal {
      constructor(name: string) {
        super(name);
      }
    
      eat(): void {
        console.log('吃老鼠');
      }
    }
  • 相关阅读:
    修改VNC的分辨率
    How to use WinSCP with public key authentication
    CentOS-7-x86_64-DVD-1511.iso
    6.828
    Tampermonkey版Vimium
    servlet+jsp完成简单登录
    Servlet知识点小结
    HTTP基础知识点小结
    LeetCode 371两数之和
    LeetCode53 最大子序列问题
  • 原文地址:https://www.cnblogs.com/zhangning187/p/tsclasszn210411.html
Copyright © 2011-2022 走看看