将函数附加到JavaScript对象文本的_proto_________________________________?

将函数附加到JavaScript对象文本的_proto_________________________________?,javascript,node.js,object-literal,proto,Javascript,Node.js,Object Literal,Proto,我有一个对象文字: 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.i

我有一个对象文字:

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对象,因为它会降低执行速度。然而,我并没有重新分配它,我只是在附加它


是否有更好的替代方案?

这实际上不需要使用原型。您不需要创建许多需要在更高级别抽象的公共功能的实例,只需在tasks对象上添加一个方法即可

如果要确保与现有关键点没有冲突,可以使用

您也可以使用一个独立函数来完成此操作,类似于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')
这种方法的优点是,您的任务被封装在一个对其进行操作的容器中,从而限制了任务应该使用的范围,并向程序员更清楚地建议任务应该使用哪些函数

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

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

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

如果要确保与现有关键点没有冲突,可以使用

您也可以使用一个独立函数来完成此操作,类似于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')
这种方法的优点是,您的任务被封装在一个对其进行操作的容器中,从而限制了任务应该使用的范围,并向程序员更清楚地建议任务应该使用哪些函数

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

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

从性能和浏览器兼容性的角度来看,这都不是一个好主意

请从以下位置查看这些警告:

警告:根据对象的性质,更改对象的[[Prototype]]是 现代JavaScript引擎如何优化属性访问,这是一个非常缓慢的过程 操作,在每个浏览器和JavaScript引擎中。影响 改变继承的表现是微妙而深远的,而且是 不仅限于在obj.proto=。。。陈述 但可以扩展到任何可以访问其 [[Prototype]]已被修改。如果你在乎表现,你会 应避免设置对象的[[Prototype]]。相反,创建一个 使用object.create创建具有所需[[Prototype]]的新对象

-

警告:虽然Object.prototype.proto目前在大多数应用程序中都受支持 浏览器,它的存在和确切的行为只是被标准化了 在ECMAScript 2015规范中,作为一项传统功能确保 web浏览器的兼容性。为获得更好的支持,建议使用 只能使用Object.getPrototypeOf


从性能和浏览器兼容性的角度来看,这都不是一个好主意

请从以下位置查看这些警告:

警告:根据对象的性质,更改对象的[[Prototype]]是 现代JavaScript引擎如何优化属性访问,这是一个非常缓慢的过程 操作,在每个浏览器和JavaScript引擎中。影响 改变继承的表现是微妙而深远的,而且是 不仅限于在obj.proto=。。。陈述 但可以扩展到任何可以访问其 [[Prototype]]已被修改。如果你在乎表现,你会 应避免设置对象的[[Prototype]]。相反,创建一个 使用object.create创建具有所需[[Prototype]]的新对象

-

警告:虽然Object.prototype.proto目前在大多数应用程序中都受支持 浏览器,它的存在和确切的行为只是被标准化了 在ECMAScript 2015规范中,作为一项传统功能确保 web浏览器的兼容性。为获得更好的支持,建议使用 只能使用Object.getPrototypeOf


你需要一个构造函数/工厂函数。你需要一个构造函数/工厂函数。谢谢。看到一个任务管理器实体是很有帮助的,而且以前没有看到过。从语义上讲,将任务管理器声明为“var”不是更好吗?因为任务管理器会随着时间的推移而改变…const不适用
指向值,但指向引用。不能将用const声明的变量指向其他变量,但可以更改值本身。谢谢看到一个任务管理器实体是很有帮助的,而且以前没有看到过。从语义上讲,将任务管理器声明为“var”不是更好吗?因为任务管理器会随着时间的推移而改变……const不应用于值,而是应用于引用。不能将用const声明的变量指向其他变量,但可以更改值本身。