小白提问,小程序中如何使用js类
[代码]/*[代码][代码] [代码][代码]author: leeenx[代码][代码] [代码][代码]@ timer 对象[代码][代码] [代码][代码]@ 提供 7 个API如下:[代码][代码] [代码][代码]@ timer.setTimeout(fun, delay[, id])[代码][代码] [代码][代码]@ timer.clearTimeout(id)[代码][代码] [代码][代码]@ timer.setInterval(fun, delay[, id])[代码][代码] [代码][代码]@ timer.clearInterval(id)[代码][代码] [代码][代码]@ timer.delete(id) 删除对应id的timeout/interval[代码][代码] [代码][代码]@ timer.pause(id) 暂停对应id的timeout/interval[代码][代码] [代码][代码]@ timer.resume(id) 恢复对应id的timeout/interval[代码][代码] [代码][代码]@ timer.clean() 清空所有 timeout & interval[代码][代码]*/[代码] [代码]class Timer {[代码][代码] [代码][代码]// 构造函数 [代码][代码] [代码][代码]constructor() { [代码][代码] [代码][代码]// 暂停状态 - 这是个公共状态,由外部 Ticker 决定。[代码][代码] [代码][代码]this[代码][代码].paused = [代码][代码]true[代码][代码]; [代码] [代码] [代码][代码]// 队列[代码][代码] [代码][代码]this[代码][代码].queue = [代码][代码]new[代码] [代码]Map(); [代码] [代码] [代码][代码]// 正在使用 timer 的 RAF[代码][代码] [代码][代码]this[代码][代码].usingRAF = [代码][代码]false[代码][代码]; [代码] [代码] [代码][代码]// useRAF 触发器[代码][代码] [代码][代码]Reflect.defineProperty([代码][代码]this[代码][代码], [代码][代码]"useRAF"[代码][代码], {[代码][代码] [代码][代码]set: [代码][代码]function[代码][代码](value) {[代码][代码] [代码][代码]Reflect.set([代码][代码]this[代码][代码], [代码][代码]"usingRAF"[代码][代码], value); [代码][代码] [代码][代码]value ? Timer.RAF.enable() : Timer.RAF.disable(); [代码][代码] [代码][代码]}[代码][代码] [代码][代码]}); [代码][代码] [代码][代码]}[代码] [代码] [代码][代码]// setTimeout 的实现[代码][代码] [代码][代码]setTimeout(fn, delay, id = Symbol([代码][代码]"timeoutID"[代码][代码])) { [代码][代码] [代码][代码]// 存入队列 [代码][代码] [代码][代码]this[代码][代码].queue.set(id, {[代码][代码] [代码][代码]fn: fn, [代码][代码] [代码][代码]type: 0, [代码][代码] [代码][代码]paused: 0, [代码][代码] [代码][代码]elapsed: 0, [代码][代码] [代码][代码]delay: delay[代码][代码] [代码][代码]}); [代码][代码] [代码][代码]return[代码] [代码]id; [代码][代码] [代码][代码]}[代码] [代码] [代码][代码]// clearTimeout[代码][代码] [代码][代码]clearTimeout(id) {[代码][代码] [代码][代码]return[代码] [代码]this[代码][代码].[代码][代码]delete[代码][代码](id); [代码][代码] [代码][代码]}[代码] [代码] [代码][代码]// setInterval 的实现[代码][代码] [代码][代码]setInterval(fn, delay, id = Symbol([代码][代码]"intervalID"[代码][代码])) {[代码][代码] [代码][代码]// 存入队列[代码][代码] [代码][代码]this[代码][代码].queue.set(id, {[代码][代码] [代码][代码]fn: fn, [代码][代码] [代码][代码]type: 1, [代码][代码] [代码][代码]paused: 0, [代码][代码] [代码][代码]elapsed: 0, [代码][代码] [代码][代码]delay: delay[代码][代码] [代码][代码]}); [代码][代码] [代码][代码]return[代码] [代码]id; [代码][代码] [代码][代码]}[代码] [代码] [代码][代码]// clearInterval[代码][代码] [代码][代码]clearInterval(id) {[代码][代码] [代码][代码]return[代码] [代码]this[代码][代码].[代码][代码]delete[代码][代码](id); [代码][代码] [代码][代码]}[代码] [代码] [代码][代码]// 修改指定id的 delay/fn[代码][代码] [代码][代码]set(id, config = {}) { [代码][代码] [代码][代码]let item = [代码][代码]this[代码][代码].queue.get(id) || {}; [代码][代码] [代码][代码]for[代码][代码](let key [代码][代码]in[代码] [代码]config) {[代码][代码] [代码][代码]item[key] = config[key]; [代码][代码] [代码][代码]}[代码][代码] [代码][代码]return[代码] [代码]true[代码][代码]; [代码][代码] [代码][代码]}[代码] [代码] [代码][代码]// 删除 queue 上的成员[代码][代码] [代码][代码]delete[代码][代码](id) {[代码][代码] [代码][代码]return[代码] [代码]this[代码][代码].queue.[代码][代码]delete[代码][代码](id); [代码][代码] [代码][代码]}[代码] [代码] [代码][代码]// 暂停指定id[代码][代码] [代码][代码]pause(id) {[代码][代码] [代码][代码]id === undefined ? [代码][代码]this[代码][代码].pauseAll() : ([代码][代码]this[代码][代码].queue.get(id).paused = 1); [代码][代码] [代码][代码]return[代码] [代码]true[代码][代码]; [代码][代码] [代码][代码]}[代码] [代码] [代码][代码]// 恢复指定id[代码][代码] [代码][代码]resume(id) {[代码][代码] [代码][代码]return[代码] [代码]this[代码][代码].play(id); [代码][代码] [代码][代码]} [代码][代码] [代码] [代码] [代码][代码]// 播放指定id[代码][代码] [代码][代码]play(id) {[代码][代码] [代码][代码]id === undefined ? [代码][代码]this[代码][代码].playAll() : ([代码][代码]this[代码][代码].queue.get(id).paused = 0); [代码][代码] [代码][代码]return[代码] [代码]true[代码][代码]; [代码][代码] [代码][代码]} [代码] [代码] [代码][代码]// 清空timer[代码][代码] [代码][代码]clean() {[代码][代码] [代码][代码]this[代码][代码].queue = [代码][代码]new[代码] [代码]Map(); [代码][代码] [代码][代码]return[代码] [代码]true[代码][代码]; [代码][代码] [代码][代码]}[代码] [代码] [代码][代码]// 暂停全部 id[代码][代码] [代码][代码]pauseAll() {[代码][代码] [代码][代码]this[代码][代码].queue.forEach((item) => item.paused = 1); [代码][代码] [代码][代码]return[代码] [代码]true[代码][代码]; [代码][代码] [代码][代码]}[代码] [代码] [代码][代码]// 播放全部 id[代码][代码] [代码][代码]playAll() {[代码][代码] [代码][代码]this[代码][代码].queue.forEach((item) => item.paused = 0); [代码][代码] [代码][代码]return[代码] [代码]true[代码][代码];[代码][代码] [代码][代码]}[代码] [代码] [代码][代码]// 重置 elapsed 为 0[代码][代码] [代码][代码]reset = [代码][代码]function[代码][代码](id) {[代码][代码] [代码][代码]id === undefined ? [代码][代码]this[代码][代码].resetAll() : ([代码][代码]this[代码][代码].queue.get(id).elapsed = 0); [代码][代码] [代码][代码]}[代码] [代码] [代码][代码]// 重置所有的 elapsed 为 0[代码][代码] [代码][代码]resetAll = [代码][代码]function[代码][代码]() {[代码][代码] [代码][代码]this[代码][代码].queue.forEach([代码][代码]function[代码][代码](item) {item.elapsed = 0}); [代码][代码] [代码][代码]}[代码] [代码] [代码][代码]// tick[代码][代码] [代码][代码]tick(delta) { [代码][代码] [代码][代码]this[代码][代码].paused || [代码][代码]this[代码][代码].updateQueue(delta); [代码][代码] [代码][代码]}[代码] [代码] [代码][代码]// 更新 map 队列[代码][代码] [代码][代码]updateQueue(delta) { [代码][代码] [代码][代码]this[代码][代码].queue.forEach((item, id) => {[代码][代码] [代码][代码]if[代码][代码](item.paused === 1) [代码][代码]return[代码][代码]; [代码][代码] [代码][代码]item.elapsed += delta; [代码][代码] [代码][代码]if[代码][代码](item.elapsed >= item.delay) {[代码][代码] [代码][代码]item.fn(); [代码][代码] [代码][代码]item.type === 0 ? [代码][代码]this[代码][代码].[代码][代码]delete[代码][代码](id) : (item.elapsed = 0); [代码][代码] [代码][代码]} [代码][代码] [代码][代码]}); [代码][代码] [代码][代码]}[代码] [代码] [代码][代码]// 状态更新[代码][代码] [代码][代码]update() { [代码][代码] [代码][代码]// 第一次调用 update 时主动停用原生接口[代码][代码] [代码][代码]this[代码][代码].useRAF = [代码][代码]false[代码][代码]; [代码] [代码] [代码][代码]// 下面是真正的 update[代码][代码] [代码][代码]this[代码][代码].update = (delta) => {[代码][代码] [代码][代码]if[代码][代码]([代码][代码]this[代码][代码].usingRAF) [代码][代码]return[代码][代码]; [代码][代码] [代码][代码]this[代码][代码].tick(delta); [代码][代码] [代码][代码]} [代码][代码] [代码][代码]}[代码] [代码]}[代码] [代码]class AnimationFrame { [代码][代码] [代码][代码]constructor() {[代码][代码] [代码][代码]this[代码][代码].time = 0; [代码][代码] [代码][代码]this[代码][代码].auto = [代码][代码]this[代码][代码].auto.bind([代码][代码]this[代码][代码]); [代码][代码] [代码][代码]}[代码][代码] [代码][代码]auto(elapsed) { [代码][代码] [代码][代码]timer.tick(elapsed - [代码][代码]this[代码][代码].time); [代码][代码] [代码][代码]this[代码][代码].time = elapsed; [代码][代码] [代码][代码]this[代码][代码].id = requestAnimationFrame([代码][代码]this[代码][代码].auto); [代码][代码] [代码][代码]}[代码][代码] [代码][代码]enable() { [代码][代码] [代码][代码]timer.paused = [代码][代码]false[代码][代码]; [代码][代码] [代码][代码]this[代码][代码].id = requestAnimationFrame([代码][代码]this[代码][代码].auto); [代码][代码] [代码][代码]}[代码][代码] [代码][代码]disable() {[代码][代码] [代码][代码]cancelAnimationFrame([代码][代码]this[代码][代码].id); [代码][代码] [代码][代码]}[代码][代码]}[代码] [代码]// 原生RAF[代码][代码]Timer.RAF = [代码][代码]new[代码] [代码]AnimationFrame(); [代码] [代码]// 对外接口[代码][代码]let timer = [代码][代码]new[代码] [代码]Timer(); [代码] [代码]// 默认使用原生 RAF[代码][代码]timer.useRAF = [代码][代码]true[代码][代码]; [代码][代码]// 导出timer[代码][代码]export [代码][代码]default[代码] [代码]timer;[代码]上面的代码,想放到小程序中使用,应该怎么做?