【问题标题】:Memory usage of JavaScript objectsJavaScript 对象的内存使用情况
【发布时间】:2014-07-30 00:26:03
【问题描述】:

如果我有一个包含三个对象的数组:

var array = [obj1, obj2, obj3];

我的对象有一个特定属性(例如:“id”)和两个公共属性(例如:“prop”和“log”函数)..

我想知道哪个内存使用量最少?用什么比较好?

在我的数组的所有项目上定义相同的属性:

var obj1 = {id: 1, prop: '@', log: function() { console.log('TEST'); }};
var obj2 = {id: 2, prop: '@', log: function() { console.log('TEST'); }};
var obj3 = {id: 3, prop: '@', log: function() { console.log('TEST'); }};

var array = [obj1, obj2, obj3];

对比

使用给定的原型创建对象(我的数组的项目)

var myProto = {prop: '@', log: function() { console.log('TEST'); }};

var obj1 = Object.create(myProto);
obj1.id = 1;

var obj2 = Object.create(myProto);
obj2.id = 2;

var obj3 = Object.create(myProto);
obj3.id = 3;

var array = [obj1, obj2, obj3];

对比

创建一个具有公共属性的对象并扩展我的数组项以使用该对象

var common = {prop: '@', log: function() { console.log('TEST'); }};

var obj1 = extend({id: 1}, common);
var obj2 = extend({id: 2}, common);
var obj3 = extend({id: 3}, common);

var array = [obj1, obj2, obj3];

【问题讨论】:

  • 为什么不是第四个选项,类似于您的第二个选项,但是在使用newObject.create 时将id 添加到原型并为其分配一个值?
  • 你能举个例子吗?
  • 见 Greg Burghardt 的回答。
  • 也许这会有所帮助。 Object.create 和/或构造函数使用较少的 CPU 和内存,是 oop JavaScript 的常用模式:stackoverflow.com/questions/16063394/…

标签: javascript arrays memory


【解决方案1】:

案例一 - 您正在创建 3 个具有不同属性的独立对象(虽然 prop 和 log 看起来相同,但它们没有任何共同点)。

案例二 - 在这里您使用的是原型。属性和函数对共享此原型的所有对象都是通用的。

案例三 - 您正在扩展您的对象,这意味着复制属性和引用。在你的情况下,你绝对不想这样。虽然如果您想要这样做可能会很有用,但最终可能会造成内存泄漏,因为当您处理对象时 - 您必须分离对其他对象和函数的所有引用。

结论,使用原型在对象之间共享东西。

【讨论】:

    【解决方案2】:

    从记忆的角度来看,使用原型会更有效。其次,由于您想在每个新对象中初始化一个属性,您可能需要构造函数。

    function Foo(id) {
        this.id = id || null;
    }
    
    Foo.prototype = {
    
        id: null,
    
        prop: "@",
    
        constructor: Foo,
    
        log: function() {
            console.log("TEST");
        }
    
    };
    
    var array = [
        new Foo(1),
        new Foo(2),
        new Foo(3)
    ];
    

    【讨论】:

    • @Nit 这里没有理由将id 添加到prototype,因为构造函数的代码无条件地在实例本身上设置了id 属性。但是,如果代码是if (id) this.id = id;,情况会有所不同。但是,请注意,即使您可以通过原型共享默认值来减少内存消耗,但在性能方面效率低下。作为一般规则,通过原型共享函数,而不是属性,除非唯一的目标是节省内存。 msdn.microsoft.com/en-us/library/windows/apps/hh781219.aspx
    • 或者除非目标是为属性设置默认值。至于执行构造函数所需的额外处理器时间,我怀疑用户会注意到任何差异,除非您在运行时实例化数百或数千个对象。实际的性能差异可以忽略不计。
    • @Nit:我向对象原型添加属性的另一个原因,除了设置默认值之外,是一种与其他程序员交流他们应该期望在这个对象中看到哪些属性的方法类型。
    猜你喜欢
    • 2010-10-08
    • 2010-11-26
    • 2012-01-13
    • 1970-01-01
    • 2022-01-12
    • 2012-08-27
    • 1970-01-01
    • 2012-12-30
    相关资源
    最近更新 更多