TypeScript17:静态成员

一、什么是静态成员

静态成员是指,附着在类上的成员(属于某个构造函数的成员)

class User {
  constructor(
    public loginId: string,
    public loginPwd: string,
    public name: string,
    public age: number) { }
  
  static login(loginId: string,loginPwd: string): User | undefined {
    console.log('login');
    return undefined
  }
}
const result = User.login('admin', '123456'); // login

使用 static 修饰的成员是静态成员,可以直接用类名调用。

实例成员:对象成员,属于某个类的对象;

静态成员:非实例成员,属于某个类。

class User {
  static users:User[] = []
  constructor(
    public loginId: string,
    public loginPwd: string,
    public name: string,
    public age: number) { 
      // 需要将新建的用户加入到数组中
      User.users.push(this)
    }
  static login(loginId: string,loginPwd: string): User | undefined {
    console.log('login');
    return User.users.find(u => u.loginId === loginId && u.loginPwd === loginPwd)
  }
  sayHello() {
    console.log(`大家好,我叫${this.name},今年${this.age}岁,我的账号是${this.loginId}`);
  }
}
const u1 = new User('u1', '123','张三',12); // 新建一个用户
const u2 = new User('u2', '123','李四',13); // 新建一个用户
const u3 = new User('u3', '123', '王二麻', 14); // 新建一个用户
const result = User.login('u1', '123'); // 模拟登录
if (result) {
  result.sayHello() // 大家好,我叫张三,今年12岁,我的账号是u1
} else { 
  console.log('登录失败');
}

上面代码中, User 作为一个用户类,每新建一个用户需要通过 new 方法来创建。

新建的用户需要在类内部保存到数组中, 以便登陆时通过 login 来校验账户和密码,这时的 users 应为一个静态成员。如果为一个实例成员,则会导致每创建一个用户, users 的值都会发生变化,无法进行登录校验。

二、静态方法中的 this

实例方法中的 this 指向的是当前对象;

静态方法中的 this 指向的是当前类。

上面例子中,类中的登录方法可以通过 this 访问 users ,效果一致。

static login(loginId: string,loginPwd: string): User | undefined {
  return this.users.find(u => u.loginId === loginId && u.loginPwd === loginPwd)
}

三、设计模式:单例模式 

单例模式:某些类的对象,在系统中最多只能有一个,为了避免开发者造成随意创建多个类对象的错误,可以使用单例模式进行强约束。

通过静态方法创建一个对象:  this 指向棋盘 Board 

class Board { 
  width: number = 500;
  height: number = 700;
  init() { 
    console.log("初始化棋盘");
  }
  private constructor() { }
  private static _board?: Board;
  static createBoard(): Board { 
    // 判断私有的_board是不是已经有值,如果有值,返回该棋盘对象;
    // 如果没有值,新建一个棋盘对象返回
    if (this._board) {
      return this._board
    }
    this._board = new Board();
    return this._board;
  }
}
const board1 = Board.createBoard(); // 返回一个棋盘对象
const board2 = Board.createBoard(); // 返回一个棋盘对象
board1.init() // 初始化棋盘
console.log( board1 === board2); // true
class Board { 
  width: number = 500;
  height: number = 700;
  init() { 
    console.log("初始化棋盘");
  }
  private constructor() { }
  static readonly singleBoard = new Board();
}
const board1 = Board.singleBoard; // 返回一个棋盘对象
const board2 = Board.singleBoard; // 返回一个棋盘对象
board1.init() // 初始化棋盘
console.log( board1 === board2); // true

区别:下面这种写法在最开始就创建棋盘,而不是在需要的时候创建;创建棋盘时候没有办法写很多代码,例如异步等。

  • 9
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

猛扇赵四那半好嘴

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值