将函数附加到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声明的变量指向其他变量,但可以更改值本身。