• 继承

    class Animal {
      move(distance: number = 0) {
        console.log(`Animal moved ${distance}m.`)
      }
    }
    
    class Dog extends Animal {
      bark() {
        console.log('Woof! Woof!')
      }
    }
    
    const dog = new Dog()
    dog.bark()
    dog.move(10)
    

    子类重写父类的方法

    派生类包含了一个构造函数,它必须调用super(),它会执行基类的构造函数。

    class Animal {
      name: string
      constructor(name: string) { 
        this.name = name
      }
      move(distance: number = 0) {
        console.log(`${this.name} moved ${distance}m.`)
      }
    }
    
    class Snake extends Animal {
      constructor(name: string) { 
        super(name)
      }
      move(distance: number = 5) {
        console.log('Slithering...')
        super.move(distance)
      }
    }
    
    class Horse extends Animal {
      constructor(name: string) {
        super(name)
      }
      move(distance: number = 45) {
        console.log('Galloping...')
        super.move(distance)
      }
    }
    
    let sam = new Snake('Sammy')
    let tom: Animal = new Horse('Tommy')
    
    sam.move()
    tom.move(34)
    

    Snake类和 Horse 类都创建了 move 方法,它们重写了从 Animal 继承来的 move 方法,使得 move 方法根据不同的类而具有不同的功能。注意,即使 tom 被声明为 Animal 类型,但因为它的值是 Horse,调用 tom.move(34) 时,它会调用 Horse 里重写的方法。

    Slithering...
    Sammy moved 5m.
    Galloping...
    Tommy moved 34m.
    

    公共,私有与受保护的修饰符

    仅当类被实例化的时候才会被初始化的属性

    默认为 public

    class Animal {
      public name: string
      public constructor(name: string) {
        this.name = name
      }
      public move(distance: number) {
        console.log(`${this.name} moved ${distance}m.`)
      }
    }
    

    private

    当成员被标记成 private 时,它就不能在声明它的类的外部访问。

    class Animal {
      private name: string
      constructor(name: string) { 
        this.name = name
      }
    }
    
    new Animal('Cat').name // 错误: 'name' 是私有的.
    

    protected

    protected与private的行为很相似,但有一点不同,protected成员在派生类中仍然可以访问。

    class Person {
      protected name: string
      constructor(name: string) { 
        this.name = name 
      }
    }
    
    class Employee extends Person {
      private department: string
    
      constructor(name: string, department: string) {
        super(name)
        this.department = department
      }
      
      getElevatorPitch() {
        return `Hello, my name is ${this.name} and I work in ${this.department}.`
      }
    }
    
    let howard = new Employee('Howard', 'Sales')
    console.log(howard.getElevatorPitch())  // protected成员在派生类中仍然可以访问。
    console.log(howard.name) // error  不能在声明它的类的外部访问
    

    readonly

    readonly 只读属性必须在声明时或构造函数里被初始化

    class Person {
      readonly name: string
      constructor(name: string) {
        this.name = name
      }
    }
    
    

    静态属性

    属性存在于类本身上面而不是类的实例上。

    class Grid {
      static origin = {x: 0, y: 0}
    
      scale: number
    
      constructor (scale: number) {
        this.scale = scale
      }
    
      calculateDistanceFromOrigin(point: {x: number; y: number}) {
        let xDist = point.x - Grid.origin.x
        let yDist = point.y - Grid.origin.y
        return Math.sqrt(xDist * xDist + yDist * yDist) * this.scale
      }
    }
    
    let grid1 = new Grid(1.0)  // 1x scale
    let grid2 = new Grid(5.0)  // 5x scale
    
    console.log(grid1.calculateDistanceFromOrigin({x: 3, y: 4}))
    console.log(grid2.calculateDistanceFromOrigin({x: 3, y: 4}))
    

    每个实例想要访问这个属性的时候,都要在 origin 前面加上类名。 如同在实例属性上使用 this.xxx 来访问属性一样,这里我们使用 Grid.xxx 来访问静态属性。

    把类当做接口使用

    class Point {
      x: number
      y: number
    }
    
    interface Point3d extends Point {
      z: number
    }
    
    let point3d: Point3d = {x: 1, y: 2, z: 3}
    
  • 相关阅读:
    mysqldump 5.7
    MySQL 5.7主从复制
    MySQL 5.7安装与配置
    MySQL 5.7二进制日志
    Servlet3.x部署描述符
    Redis 4.0.2分布式锁的Java实现
    Redis 4.0.2安装与卸载
    Echarts主题颜色
    eclipse插件jd-eclipse的使用
    Crack IDEA
  • 原文地址:https://www.cnblogs.com/renzhiwei2017/p/15533104.html
Copyright © 2020-2023  润新知