在 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/