JavaScript对象的内存使用

JavaScript对象的内存使用,javascript,arrays,memory,Javascript,Arrays,Memory,如果我有一个包含三个对象的数组: var array = [obj1, obj2, obj3]; 我的对象有一个特定属性(例如:“id”)和两个公共属性(例如:“prop”和“log”函数) 我想知道哪一个内存使用最少?用什么更好 在我的数组的所有项上定义相同的属性: var obj1 = {id: 1, prop: '@', log: function() { console.log('TEST'); }}; var obj2 = {id: 2, prop: '@', log: functi

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

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];
vs

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

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];
vs

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

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];

从内存的角度来看,使用原型会更有效率。其次,由于您希望初始化每个新对象中的属性,因此可能需要构造函数

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)
];

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

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

案例三:您正在扩展对象,这意味着复制属性和引用。在你的情况下,你肯定不想走这条路。虽然如果您想完全做到这一点,它可能会很有用,但最终可能会造成内存泄漏,因为在处理对象时,必须分离对其他对象和函数的所有引用

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)
];

结论,使用原型在对象之间共享内容。

为什么不使用第四个选项,类似于第二个选项,但在使用
新建
对象时,将id添加到原型并为其赋值。创建
?您能举个例子吗?请参阅Greg Burghardt的答案。这可能会有所帮助。Object.create和/或构造函数使用更少的CPU和内存,是oop JavaScript的常用模式:@Nit没有理由在这里将
id
添加到
prototype
中,因为构造函数的代码无条件地设置实例本身的
id
属性。但是,如果代码是
if(id)this.id=id,则情况会有所不同。但是,请注意,尽管您可以通过原型共享默认值来减少内存消耗,但它在性能方面效率低下。一般来说,通过原型共享函数,但不共享属性,除非唯一的目标是节省内存。或者,除非目标是为属性设置默认值。至于执行构造函数所需的额外处理器时间,我怀疑用户是否会注意到任何差异,除非您在运行时实例化数百或数千个对象。实际的性能差异可以忽略不计。@Nit:除了设置默认值之外,我向对象的原型添加属性的另一个原因是,可以通过一种方式与其他程序员交流他们希望在这种类型的对象中看到的属性。