2015-05-22 64 views
1

我一直在Javascript中使用靜態方法進行實驗。我沒有從原型繼承對象,而是使用鴨子打字困難得多。Javascript靜態方法vs原型/ instatiated方法的性能

var Controller = {}; 
Controller.getData = function() {//return data}; 

// and then in use: 
var page = route.getPage(); 
require([page], function(Controller) { 
    Controller.getData(); 
}); 

,我可以通過與控制器原型創建新的對象做相同的:

function Controller() {}; 
Controller.prototype.getData = function() {//return data}; 

// and then in use: 
var page = route.getPage(); 
require([page], function(Controller) { 
    var controller = new Controller(); 
    controller.getData(); 
}); 

我的直覺是,靜態方法會更快,但我不知道。一般來說,這兩種方法之間的性能差異是什麼?

TLDR;基本上this問題,但爲Javascript。

+0

你應該在https://jsperf.com/建立一個測試用例並測試你的假設(在這裏:http://jsperf.com/static-vs-prototype-methods-test,差別對於大多數人基本測試) –

+0

我期望他們執行相同的操作。可能會有一些關於多級繼承的奇怪現象,原型鏈必須遍歷(我不確定JavaScript是否優化查找)。如果你直接在你打算使用的物體上放置東西,我懷疑會有什麼不同。說實話,這涉及到getData是否需要訪問Controller實例。像Rob說的,給jsperf.com一個嘗試。這可能值得一試。 –

+0

JavaScript不支持靜態方法 - 使用原型最接近靜態方法。您鏈接的問題是針對C#而不是JavaScript。 –

回答

0

編輯:因此,在實例化類與調用「靜態」版本時存在性能差異,但差異並不能真正保證對代碼進行任何更改(過早優化),除非你看到一個實際的減速。

正如在基本jsperf測試我設置,證明那裏真的沒有太大的區別,性能明智。你應該根據你是否想要上下文(this)來引用你的基類來做出決定。

+0

我用我認爲更重要的一點點更新了你的測試。這樣測試是否有意義?這更多的是我想到的。似乎還有一個更重要的區別。 http://jsperf.com/static-vs-prototype-methods-test/2 – eatonphil

+0

@eatonphil謝謝!我其實只是做同樣的事情,我會更新答案 –

+0

對於我來說,Firefox有一個重大的區別,但在Chrome上它們幾乎是平等的。你仍然覺得這是一個很好的測試嗎?我可以從這些性能測試中有效地推斷出性能(只是在Firefox上,我猜)? – eatonphil