TypeScript 中 类,静态属性何时使用,类的单件模式

94 阅读2分钟

类,静态属性

1、定义:类就是拥有相同属性和方法的一系列对象集合。

2、展开理解:类是一个模具,是该类包含的所有具体对象中抽象出来的一个概念,类定义了它所包含的静态特征和动态特征。

ts中的类编译成es5之后,它的本质是一个构造函数。

静态的属性和成员都是属于于类(构造函数)所指向的对象空间,挂载到类上。

class People {
  name: string;
  age: number;
  addr: string;
  
  // 当加上static关键字后,count就归属于类(构造函数)空间中的变量。已经不属于this指向的对象。
  static count: number = 0;
  
  constructor(_name: string, _age: number, _addr: string) {
    this.name = _name;
    this.age = _age;
    this.addr = _addr;
    
    People.count++;
  }
  doEat(){}
  doStep(){}
}

let p1 = new People("wangwu"23"上海市");
let p2 = new People("wangwu2"25"上海市");
console.log(People.count); // 2
p1.doEat();

何时用静态属性

export default class DateUtil {
  static formatDate() {}
  static diffDateByDay() {}
  static diffDateByHour() {}
  static timeConversion() {}
}

// 工具类只需要一个对象就可以。
// let dateUtil = new DateUtil();
// 当需要使用方法时,可以把需要的函数定义成静态属性。
DateUtil.formatDate();

TS 单件(例)模式的两种实现

定义:单件模式是指一个类只允许外部获取到它唯一的实例对象。

外部调用时实例只创建一次

比静态调用更简洁

class DateUtil {
  static dateUtil: new DateUtil(); // 立即创建单件模式
  
  private constructor() {
    console.log("创建对象");
  }
  
  formatDate() {
    console.log("fomatDate");
  }
  diffDateByDay() {}
  diffDateByHour() {}
  timeConversion(restTime: number) {}
}

const dateUtil1 = DateUtil.dateUtil;
const dateUtil2 = DateUtil.dateUtil;
console.log(dateUtil1 === dateUtil2); // true

dateUtil1.formatDate();

export default DateUtil.dateUtil;

上方代码第一次执行时不管外部是否调用,都会创建实例

下方代码第一次执行时外部调用时,才会创建实例

class DateUtil {
  static dateUtil:DateUtil
  static getInstance() {
    if(!this.dateUtil) {
      this.dateUtil = new DateUtil;
    }
    return this.dateUtil;
  }
  private constructor() {
    console.log("创建对象");
  }
  
  formatDate() {
    console.log("fomatDate");
  }
  diffDateByDay() {}
  diffDateByHour() {}
  timeConversion(restTime: number) {}
}

const dateUtil1 = DateUtil.getInstance();
const dateUtil2 = DateUtil.getInstance();

console.log(dateUtil1 === dateUtil2); // true

如果觉得有点用的话,不妨点个赞再走吧~