2017-08-07 79 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()。

相關問題