实际上没有必要为此使用原型。您不会创建许多需要在更高级别抽象出通用功能的实例,您只需在tasks
对象上添加一个方法即可。
const tasks = {
start(key) {
const task = this[key]
// do stuff with task
}
}
// example call
tasks.start('123');
如果要确保与现有密钥没有冲突,可以使用Symbol代替。
const startSymbol = Symbol('start');
const tasks = {
[startSymbol](key) {
const task = this[key]
// do stuff with task
}
}
// example call
tasks[startSymbol]('123');
您也可以只使用一个独立的函数来执行此操作,类似于您的addTask
函数:
function start(tasks, key) {
const task = tasks[key]
// do stuff with task
}
// example call
start(tasks, '123')
拥有这个独立的功能可能会更好,因为您不必担心任务键和方法名称之间的冲突。
您还可以创建一个执行此分离的包装器对象:
const taskManager = {
tasks: {} // map of key to task
// methods
add(task) {
this.tasks[task.id] = task;
this.start(task.id);
}
start(key) {
const task = this.tasks[key];
// do stuff with task
}
}
// example usage
taskManager.start('123')
这种方法的优点是你tasks
被封装在一个容器中,对它们进行操作,限制了tasks
应该使用的范围,并更清楚地(向程序员建议)哪些函数应该用于任务。
如果您计划拥有多个任务管理器,那么在这里使用原型可能是有意义的:
class TaskManager {
constructor() {
this.tasks = {} // map of key to task
}
// methods
add(task) {
this.tasks[task.id] = task;
this.start(task.id);
}
start(key) {
const task = this.tasks[key];
// do stuff with task
}
}
// example usage
new TaskManager().start('123')