我一直在想,在javascript中使用原型是否应该比将对象的每个成员直接附加到它更节省内存,原因如下:
-
原型只是一个单一的对象。
-
实例只保存对其原型的引用。
对比:
-
每个实例都保存构造函数定义的所有成员和方法的副本。
我开始了一个小小的实验:
var TestObjectFat = function()
{
this.number = 42;
this.text = randomString(1000);
}
var TestObjectThin = function()
{
this.number = 42;
}
TestObjectThin.prototype.text = randomString(1000);
randomString(x)
只产生一个长度为x的随机字符串。
然后,我将对象大量实例化,如下所示:
var arr = new Array();
for (var i = 0; i < 1000; i++) {
arr.push(new TestObjectFat()); // or new TestObjectThin()
}
并检查浏览器进程(google chrome)的内存使用情况。我知道,那不是很准确…
然而,在这两种情况下,内存使用量都像预期的那样显著增加(对于
TestObjectFat
,但原型变体使用的内存并没有减少多少(大约26 MB用于
TestObjectThin
)
我还检查了
测试对象精简
实例在其“文本”属性中包含相同的字符串,因此它们实际上正在使用原型的属性。
现在,我不知道该怎么想。原型设计似乎一点也不节省内存。
我知道,基于许多其他原因,原型设计是一个很好的主意,但我特别关注这里的内存使用。为什么原型变体使用几乎相同的内存量?我遗漏了什么吗?