javascript - 通过原型(prototype)定义方法与在构造函数中使用它相比——真的有性能差异吗?

标签 javascript performance memory-management prototype

在 JavaScript 中,我们有两种创建“类”并为其提供公共(public)函数的方法。

方法一:

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

方法二:

function MyClass() { }

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

我读过无数次人saying使用方法 2 的效率更高,因为所有实例都共享相同的函数副本,而不是每个都获得自己的副本。但是,通过原型(prototype)定义函数有一个巨大的缺点——它不可能拥有私有(private)实例变量。

即使在理论上,使用方法 1 为对象的每个实例提供了它自己的函数副本(因此使用了更多的内存,更不用说分配所需的时间了)——这在实践中实际发生了什么吗?似乎 Web 浏览器可以轻松实现的优化是识别这种极其常见的模式,并且实际上让对象的所有实例都引用通过这些“构造函数”定义的函数的相同副本。然后,如果稍后明确更改它,它只能为实例提供它自己的函数副本。

关于两者之间的性能差异的任何见解 - 或者,更好的是真实世界的经验,都将非常有帮助。

最佳答案

参见 http://jsperf.com/prototype-vs-this

通过原型(prototype)声明您的方法更快,但这是否相关还有待商榷。

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

如果性能是一个严重的问题,并且您想进行微优化,那么我建议通过原型(prototype)声明。否则,只需使用对您来说最有意义的模式。

我要补充一点,在 JavaScript 中,有一个约定,即使用下划线为旨在被视为私有(private)的属性添加前缀(例如 _process())。大多数开发人员会理解并避免这些属性,除非他们愿意放弃社会契约,但在那种情况下,您最好不要迎合他们。我的意思是:您可能并不真的需要 true 私有(private)变量...

关于javascript - 通过原型(prototype)定义方法与在构造函数中使用它相比——真的有性能差异吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32811594/

相关文章:

java - 64位操作系统中Jvm从哪里获取堆内存?

javascript - AngularJS View 未填充

使用 Order By 时 MySQL 查询变得非常慢

c++ - C++中的delete和调用析构函数有什么区别

c# - 什么表现更差 : Reflection or Boxing?

ruby-on-rails - 学习 ruby : How to solve this problem with ruby?

c - R 将函数 Realoc 与 .C 接口(interface)一起使用

javascript - 如何按顺序检查数组 1 中的每个值,存在于数组 2 中并将其删除?

javascript - Elm:端口在嵌套模块中不起作用

javascript - D3 更新 x-y 轴