Javascript静态方法与原型/稳定方法在性能上的比较

Javascript静态方法与原型/稳定方法在性能上的比较,javascript,static-methods,prototypal-inheritance,Javascript,Static Methods,Prototypal Inheritance,我一直在尝试在Javascript中使用静态方法。我没有让对象从原型继承,而是更努力地使用duck类型 var Controller = {}; Controller.getData = function() {//return data}; // and then in use: var page = route.getPage(); require([page], function(Controller) { Controller.getData(); }); 我可以通过使用控制

我一直在尝试在Javascript中使用静态方法。我没有让对象从原型继承,而是更努力地使用duck类型

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;基本上是一个问题,但对Javascript来说是这样。

编辑:因此,在实例化类与调用“静态”版本时,会有一点性能差异,但这种差异并不真正保证您对代码进行任何更改(过早优化),除非您看到实际的速度减慢


正如在基本的testi设置中所演示的那样,从性能角度看,实际上没有太大区别。您应该根据是否希望上下文(
this
)引用您的基类来做出决定。

您应该在上放置一个测试用例,并测试您的假设(这里:,对于最基本的测试,差异看起来很小),我希望它们也能执行相同的操作。多层次继承可能有一些奇怪之处,其中必须遍历原型链(我不确定JavaScript是否优化了查找)。如果你把东西直接放在你想用的物体上,我怀疑会有什么不同。老实说,这取决于
getData
是否需要访问控制器实例。就像Rob说的,试试jsperf.com。这可能值得一试。JavaScript不支持静态方法-使用prototype最接近静态方法。你链接的问题是C#而不是JavaScript。@YazadKhambata JavaScript(ES6)确实支持静态方法(除非你使用traceur或babel,否则不会太有用)@YazadKhambata没问题,我建议你看看这篇文章:我用我认为更相关的东西更新了你的测试。这样测试有意义吗?这更是我的想法。而且似乎还有一个更显著的区别@伊顿菲尔谢谢!事实上,我也在做同样的事情,我会更新答案。firefox对我来说有很大的不同,但在chrome上它们几乎是一样的。你还觉得这是一个很好的测试吗?我能从这些性能测试(我想是在firefox上)中做出有意义的推断吗?@eatonphil我更新了我的答案,使用静态方法,你仍然可以每秒获得3300万次操作,而不是4300万次。除非你正在做一些每秒需要4500万次操作的绝对令人难以置信的卷,否则这属于过早优化的领域——所有的测试都是误导性的。静态版本的速度更快,只是因为每次都在堆上实例化一个对象(导致分配和GC压力)。调用本身没有任何实质性的区别。最初的问题本身是错误的。静态和原型函数在性能方面是相同的(原型甚至更快,因为它通常利用JIT优化)。也就是说,选择应该是出于设计目的,而不是出于急切的优化。