类的基本用法|ts

117 阅读3分钟

类的组成

类:构造函数、属性(实例属性、原型属性)、方法(实例方法、原型方法、访问器)、静态的属性和方法

所有实例上的属性都需要先声明再使用

class Circle {
    x: number;
    y: number;
    constructor (x: number, y: number = 0, ...args: number[]) {
        this.x = x
        this.y = y
    }
}
let circle = new Circle(100);
console.log(circle); // Circle { x: 100, y: 0 }

类的修饰符 public (公开的 我自己、我的儿子、外界) protected (受保护的 我自己、我的儿子) private(私有的 private)

class Animal {
    // public name!: string;
    // public age!: number;
    // constructor(name: string, age: number) {
    //     this.name = name
    //     this.age = age
    // }
    // 直接在参数中添加 public private protected这些属性 这些属性会默认添加到实例
    constructor(public name: string, public age: number) {
        this.name = name
        this.age = age
    }
}
class Cat extends Animal {}
let cat = new Cat('Tom', 10)

当子类需要扩展

class Cat extends Animal {
  public address; // 属性
  constructor(name: string, age: number) {
    super(name, age); // Animal.call(this,name,age);

    this.address = "美国"; // 添加类中的属性
    // this.name = "abc";
  }
}

属性分为静态属性、实例属性、原型属性

  • 实例属性:每个对象实例独立拥有的属性,保存在对象自身的属性中。
  • 原型属性:保存在对象的原型链上的属性,被所有实例共享。在JavaScript中,每个对象都有一个内部属性[[Prototype]]指向其原型对象。可以通过定义在原型对象上的属性,为对象的每个实例添加共享属性。

总结:实例属性是每个对象实例独立拥有的属性,而原型属性是被所有实例共享的属性。

如何设置原型属性?

// 类访问器,访问的是原型上的属性
class Animal1 {
    private _name: string = "Tom";
    get name() {
        return this._name
    }
    set name(newVal) {
        this._name = newVal
    }
}
// 直接设置
Animal1.prototype.name = '1'

静态属性:只能通过类来访问的

class Animal1 {
  static type = '哺乳类'
  private _name: string = "Tom";
  get name() {
      return this._name
  }
  set name(newVal) {
      this._name = newVal
  }
}
console.log(Animal1.type) // 哺乳类

实例/原型方法

class Animal2 {
  static getType() {
    console.log("父");
    return "哺乳类";
  }
  public eat: () => void; // 实例方法
  constructor() {
    this.eat = () => {};
  }
  say(): void {
    console.log("父 say");
  } // 不关心返回值 原型方法
}
class Mouse extends Animal2 {
  static getType() {
    // 调用父类
    console.log("子");
    super.getType();
    return "哺乳类";
  }
  say() {
    // 兼容父类,组合优先于继承
    // 子类可以随便实现
    console.log("子的say");
    super.say();
    return "abc";
  }
}
console.log(Mouse.getType());
let mouse = new Mouse();
mouse.say();

image.png

总结

当我们在正常的类中定义属性和方法时,可以根据其所属的范围进行分类和使用。

  1. 原型属性和原型方法:通过在类的原型对象(prototype)上定义属性和方法,来实现对所有实例对象的共享。在访问原型属性时,可以使用属性访问器(get)来定义属性的获取行为。
  2. 实例属性和实例方法:通过在类的构造函数中使用this关键字,将属性附加到实例对象上。实例属性和实例方法只能通过实例对象来访问和调用。
  3. 静态属性和静态方法:定义在类本身而不是实例上的属性和方法。可以在类上直接访问静态属性和调用静态方法。
  4. super关键字:在构造函数和静态方法中,super指向父类。在构造函数中,它可以调用父类的构造函数;在静态方法中,它可以调用父类的静态方法。而在原型方法中,super指向父类的原型。