一、什么是静态成员
静态成员是指,附着在类上的成员(属于某个构造函数的成员)
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
区别:下面这种写法在最开始就创建棋盘,而不是在需要的时候创建;创建棋盘时候没有办法写很多代码,例如异步等。