gpt4 book ai didi

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

转载 作者:IT王子 更新时间:2023-10-29 02:55:17 27 4
gpt4 key购买 nike

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

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com