一尘不染

通过原型定义方法还是在构造函数中使用它-确实存在性能差异吗?

javascript

在JavaScript中,我们有两种创建“类”并为其提供公共功能的方法。

方法1:

function MyClass() {
    var privateInstanceVariable = 'foo';
    this.myFunc = function() { alert(privateInstanceVariable ); }
}

方法2:

function MyClass() { }

MyClass.prototype.myFunc = function() { 
    alert("I can't use private instance variables. :("); 
}

我读过无数次的人说使用方法2效率更高,因为所有实例共享该函数的相同副本,而不是每个实例都有自己的副本。尽管通过原型定义函数有一个很大的缺点-
它使得不可能拥有私有实例变量。

即使从理论上讲,使用方法1会为对象的每个实例提供其自己的函数副本(从而使用更多的内存,更不用说分配所需的时间了)-那实际上是在发生什么吗?似乎Web浏览器可以很容易地进行优化,以识别这种极为常见的模式,并实际上使对象的所有实例引用通过这些“构造函数”定义的函数的同一副本。然后,如果稍后对其进行显式更改,则只能为实例提供其自己的函数副本。

关于两者之间的性能差异的任何见解-甚至更好的 现实经验 -都将非常有帮助。


阅读 434

收藏
2020-04-25

共1个答案

一尘不染

通过原型声明方法更快,但是是否相关尚有待商.。

如果您的应用程序中存在性能瓶颈,则不太可能是这种情况,除非您碰巧在任意动画的每一步上实例化10000个以上的对象。

如果性能是一个严重的问题,并且您想进行微优化,那么我建议您通过原型进行声明。否则,请使用最适合您的模式。

我要补充一点,在JavaScript中,有一个前缀属性约定,该属性应被视为带有下划线的私有属性(例如_process())。除非他们愿意放弃社会契约,否则大多数开发人员都会理解并避免使用这些属性,但是在这种情况下,您最好也不要照顾他们。我的意思是:您可能真的不需要
真正的私有变量…

2020-04-25