2017-08-07 80 views
1

我有一个对象字面:是否将函数追加到JavaScript 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.id] = task 
    tasks.start(task.id) 
} 

我听说,最好避免对象,它会减慢执行。但是我不会重新分配它,我正在追加它。

是否有替代方案会被认为更好?

+0

您需要一个构造函数/工厂函数。 – undefined

回答

4

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

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

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

如果你想确保有与现有键没有冲突,你可以使用一个Symbol代替。

​​

你也可以只具备一个独立的函数,这样做,同样你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') 
+0

谢谢。看到一个任务管理器实体是有帮助的,之前没有看到它 –

+0

将任务管理器声明为“var”在语义上来说不是更好吗?因为任务管理器会随时间而改变...... –

+0

'const'不适用于值,而是适用于参考。你不能用'const'声明的变量指向别的东西,但你可以改变它自己的值。 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/const – nem035

3

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

看到这些警告,从mozilla's documentation

警告:更改[[原型]]的目的是,通过 如何现代JavaScript引擎的性质Optimize属性访问,一个非常缓慢的 操作中,每个浏览器和JavaScript引擎。对改变继承性能的影响是微妙的和遥远的,并且不仅仅限于在obj中花费的时间。 proto = ...声明, ,但可以扩展到任何可以访问任何对象的代码,其中 [[Prototype]]已被更改。如果你关心性能,你应该避免设置一个对象的[[Prototype]]。相反,使用Object.create()使用所需的[[Prototype]]创建一个新的对象 。

-

警告:虽然Object.prototype中。 proto目前在大多数 浏览器中受支持,其存在和确切行为仅在ECMAScript 2015规范中标准化为 ,作为遗留功能以确保 与Web浏览器的兼容性。为了获得更好的支持,建议使用 代替使用Object.getPrototypeOf()。

相关问题