周末总得学点什么吧~
奥利给!
- 跑火车 递归 减速
let currentIndex = 0;
let speed = 500; // 初始速度,单位是毫秒
let decrement = 20; // 每次迭代速度减少的量
const cells = document.querySelectorAll('.cell');
function highlightCell() {
cells.forEach((cell, index) => {
cell.classList.remove('highlight');
if (index === currentIndex) {
cell.classList.add('highlight');
}
});
if (speed > 50) { // 当速度降低到一定程度时停止
speed -= decrement;
setTimeout(highlightCell, speed);
currentIndex = (currentIndex + 1) % cells.length; // 移动到下一个格子
}
}
highlightCell(); // 开始跑火车
- 队列
/**
* 将弹窗加入弹出窗队列
* @param {string} panelPath
* @param {string} scriptName
* @param {*} param
*/
public pushToPopupSeq(panelPath: string, scriptName: string, param: any) {
let popupDialog = {
panelPath: panelPath,
scriptName: scriptName,
param: param,
isShow: false
};
this._arrPopupDialog.push(popupDialog);
this._checkPopupSeq();
}
/**
* 检查当前是否需要弹窗
*/
private _checkPopupSeq() {
if (this._arrPopupDialog.length > 0) {
let first = this._arrPopupDialog[0];
if (!first.isShow) {
this.showDialog(first.panelPath, first.param);
this._arrPopupDialog[0].isShow = true;
}
}
}
/**
* 将弹窗从弹出窗队列中移除
* @param {string} panelPath
*/
public shiftFromPopupSeq(panelPath: string) {
this.hideDialog(panelPath, () => {
if (this._arrPopupDialog[0] && this._arrPopupDialog[0].panelPath === panelPath) {
this._arrPopupDialog.shift();
this._checkPopupSeq();
}
})
}
- ts给readonly属性赋值
除了在声明它的类或构造函数内部被赋值,有些情况下(静态只读)可能需要赋值
class TweenSystem {
static readonly instance; // 声明静态只读属性 如何赋值呢??? 请看下面
// ... 其他代码保持不变 ...
public getNum(){
console.log(123);
}
}
//这种情况如何赋值只读属性呢,看下面
// 在类外部初始化 instance
(TweenSystem.instance as any) = new TweenSystem();
// 现在可以正确访问了
const actionMgr = TweenSystem.instance;
actionMgr.getNum(); //123
那么为什么as any后就可以赋值(TweenSystem.instance as any);
在 TweenSystem.instance as any
的情况下,通过类型断言将 TweenSystem.instance
的类型临时转换为 any,从而能够给它赋值。尽管这样做在技术上是可行的,但它破坏了 TypeScript 的类型安全原则,并可能导致运行时错误或难以追踪的 bug。
通常,不建议使用类型断言来修改 readonly 属性,除非有非常明确的原因,并且完全理解可能带来的后果。如果需要在类的外部初始化 readonly 属性,更好的做法是在类的内部进行初始化
- 单例模式
class Singleton {
// 使用一个私有的静态实例变量来存储类的唯一实例
private static instance: Singleton | null = null;
// 构造函数是私有的,这样外部就无法使用 new Singleton() 来创建新的实例
private constructor() {
// 初始化代码(如果有的话)
}
// 提供一个静态方法来获取类的唯一实例
// 如果实例不存在,则创建它
public static get getInstance(): Singleton {
if (Singleton.instance === null) {
Singleton.instance = new Singleton();
}
return Singleton.instance;
}
// 类的其他方法或属性
public someMethod() {
console.log("这是 Singleton 类的一个方法");
}
}
// 使用示例
const singletonInstance = Singleton.getInstance;
singletonInstance.someMethod(); // 调用 Singleton 类的方法 //out: 这是 Singleton 类的一个方法
而有些情况下也可以直接这样
class Singleton1 {
static readonly instance = new Singleton1();
// 构造函数是私有的,这样外部就无法使用 new Singleton1() 来创建新的实例
private constructor() {
// 初始化代码(如果有的话)
console.log("在编译完就直接创建了,不管你有没有调用")
}
// 类的其他方法或属性
someMethod() {
console.log("这是 Singleton1 类的一个方法");
}
}
// 使用示例
const Singleton1Instance = Singleton1.instance;
Singleton1Instance.someMethod(); // 调用 Singleton1 类的方法
区别就在于编译后直接创建了单例,但基本上很少采用这种