原型继承应该可以节省内存,对吧?

sel*_*oup 6 javascript inheritance memory-management prototype

我一直想知道在JavaScript中使用原型是否应该比直接将对象的每个成员直接附加到它更有内存效率,原因如下:

  • 原型只是一个对象.
  • 实例仅包含对其原型的引用.

与:

  • 每个实例都包含构造函数定义的所有成员和方法的副本.

我开始做一个小实验:

var TestObjectFat = function()
    {
        this.number = 42;
        this.text = randomString(1000);
    }

var TestObjectThin = function()
    {
        this.number = 42;
    }
TestObjectThin.prototype.text = randomString(1000);
Run Code Online (Sandbox Code Playgroud)

randomString(x) 只生成一个长度为x的随机字符串.

然后我像这样大量实例化对象:

var arr = new Array();
for (var i = 0; i < 1000; i++) {
    arr.push(new TestObjectFat()); // or new TestObjectThin()
}
Run Code Online (Sandbox Code Playgroud)

并检查浏览器进程(谷歌浏览器)的内存使用情况.我知道,那不是很准确......

但是,在这两种情况下,内存使用量都按预期显着增加(大约30 MB TestObjectFat),但原型变体使用的内存不多(约26 MB TestObjectThin).

我还检查了TestObjectThin实例在其"text"属性中包含相同的字符串,因此它们实际上使用了原型的属性.

现在,我不太清楚该怎么想.原型设计似乎根本不是最大的内存保护程序.

我知道原型设计是出于许多其他原因的一个好主意,但我特别关注这里的内存使用情况.原型变体使用几乎相同数量的内存的任何解释?我错过了什么吗?

Yan*_*min 2

您的测试是可疑的 - 分配 JavaScript 对象会产生很大的开销,这可能会扭曲您的结果。如果将大量数据插入原型类中,可能会显示出更大的增益。

不幸的是,JavaScript 中的内存使用很难控制,特别是当涉及 JIT 时(你的 JIT 方法是否在内存使用模型中表示?等等)。