gpt4 book ai didi

javascript - 类中的javascript私有(private)成员会导致巨大的内存开销吗?

转载 作者:可可西里 更新时间:2023-11-01 02:25:19 26 4
gpt4 key购买 nike

在 JavaScript 中,对象的字段始终是“公共(public)的”:

function Test() {
this.x_ = 15;
}
Test.prototype = {
getPublicX: function() {
return this.x_;
}
};
new Test().getPublicX(); // using the getter
new Test().x_; // bypassing the getter

但是您可以通过使用局部变量并使用闭包作为 getter 来模拟“私有(private)”字段:

function Test() {
var x = 15;
this.getPrivateX = function() {
return x;
};
}
new Test().getPrivateX(); // using the getter
// ... no way to access x directly: it's a local variable out of scope

一个区别是使用“公共(public)”方法时,每个实例的 getter 都是同一个函数对象:

console.assert(t1.getPublicX === t2.getPublicX);

而对于“私有(private)”方法,每个实例的 getter 都是一个不同的函数对象:

console.assert(t1.getPrivateX != t2.getPrivateX);

我很好奇这种方法的内存使用情况。由于每个实例都有一个单独的 getPrivateX,如果我创建 10k 个实例,这会导致巨大的内存开销吗?

创建具有私有(private)成员和公共(public)成员的类实例的性能测试:

Jsperf

最佳答案

当然会产生内存开销。在公共(public)情况下,您的函数属于 prototype 而不是实例,这意味着只有一个实例,除非您专门为特定对象提供该函数自己的实例。在私有(private)情况下,函数属于实例,这意味着您需要执行内存管理。

我的意思是:

var t1 = new Test();
t1.getPublicX = function () {
return true;
}

var t2 = new Test();

t1.getPublicX(); // Returns true
t2.getPublicX(); // Returns 15

因此,您最终也可能遇到与公共(public)成员相同的情况。一般来说,您的问题的答案是:是的,在实例化大量对象时会产生内存开销。

我还应该补充一点,javascript 中的 publicprivate 的概念与 C++< 中的完全不同。在 C++ 中,private 封装了只能从类内部访问的成员,而在 javascript 中,您仍然可以从任何地方访问该成员。

在运行了一个简短的测试之后,开销实际上是微不足道的。该选项卡比没有它时多占用 40mb(加载了 google),如下面的屏幕截图所示:

enter image description here

Link to full size image.

关于javascript - 类中的javascript私有(private)成员会导致巨大的内存开销吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13710011/

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