gpt4 book ai didi

javascript - 将函数附加到 JavaScript 对象文字的 __proto__ 属性是否是个好主意?

转载 作者:行者123 更新时间:2023-11-30 07:32:49 29 4
gpt4 key购买 nike

我有一个对象字面量:

var tasks = {};

我基本上是这样添加的:

function addTask(task) {
tasks[task.id] = task
}

我想修改它,以便我可以在每个任务上调用 start 函数。所以:

var tasks = {};
tasks.__proto__.start = function(key) {
// do stuff with this[key]
}

function addTask(task) {
tasks[task.id] = task
tasks.start(task.id)
}

我听说最好避免使用 proto 对象,它会减慢执行速度。但是我不是重新分配它,而是附加到它。

是否有更好的替代方案?

最佳答案

实际上没有必要为此使用原型(prototype)。您不会创建许多需要在更高级别抽象的通用功能的实例,您只需在 tasks 对象上添加一个方法即可。

const tasks = {
start(key) {
const task = this[key]
// do stuff with task
}
}

// example call
tasks.start('123');

如果您想确保与现有 key 没有冲突,您可以使用 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的使用范围并使其更清晰(向程序员建议)哪些函数将用于任务。

如果您计划拥有多个任务管理器,那么在这里使用原型(prototype)可能有意义:

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')

关于javascript - 将函数附加到 JavaScript 对象文字的 __proto__ 属性是否是个好主意?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45554439/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com