创建JS对象实例的最有效方法

5

我正在尝试找出创建对象实例的最有效方法。

开始时,我使用了以下代码:

var Foo = function(a, b, c)
{
    this.a = a;
    this.b = b;
    this.c = c;
}

Foo.prototype.func = function()
{
    // Do stuff;
}

var bar = new Foo(1, 2, 3);
bar.func();

后来我听说最好跳过原型,因为新的原型可能会浪费不必要的内存,得到类似这样的结果:

var Foo = function(a, b, c)
{
    return {
        a:a,
        b:b,
        c:c,
        func:function()
        {
            // Do stuff;
        }
    }
}

var bar = Foo(1, 2, 3);
bar.func();

然而,现在当我调用多个Foo实例时,就会出现创建相同函数的问题... 那么怎么办呢...
var Foo = {
    a:null,
    b:null,
    c:null,
    func: function()
    {
        // Do stuff;
    }
}

function newFoo(a, b, c)
{
    var tmp = function(){};
    var obj = new tmp();
    obj.prototype = Foo;
    obj.a = a;
    obj.b = b;
    obj.c = c;

    return obj;
}

var bar = newFoo(1, 2, 3);
bar.func();

但现在我已经拿到了原型...

我的主要关注点是速度。涉及的对象并不太复杂,大多是一堆属性和函数。对象可以快速地创建和销毁(这就是为什么速度很重要的原因)。

谁知道最有效的方法是什么?


2
为什么不在http://jsperf.com/上设置一个简单的测试用例,看看哪个更快? - Dagg Nabbit
一个共享的(原型)函数会占用较少的内存,但速度较慢,因为需要遍历原型链。你更看重内存还是速度呢? - pimvdb
1
@minitech 我希望我没有看到那个。 - Dagg Nabbit
1
@minitech:你的jsPerf正在测试创建构造函数的速度,而不是仅从构造函数创建对象。你失去了不必为每个对象实例创建func方法的好处。 - user1106925
1
@amnotiam:你说得对,抱歉。让我修复测试。 - Ry-
显示剩余8条评论
1个回答

2
不用担心,原型似乎是创建对象最快的方法。在http://jsperf.com/object-creation-efficiency上,至少在Google Chrome Canary上,它比创建新对象快2%。
原型更快的浏览器:
  • Chrome Canary 19.0.1056.0
  • Firefox 10.0.2
创建新对象更快的浏览器:
  • Chrome 17.0.963

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接