Javascript原型使用性能

时间:2013-06-11 07:11:16

标签: javascript performance prototype

我想学习使用JavaScript原型的优点。对象原型使用正在提高性能。 我希望通过使用内存来看到这一点。

案例-1

    var Foo1 = function (name) {
        this.name = name;
        getFirstName = function() { return "name1"; };
        getLastName = function() { return "name2"; };
    };
    for (var i = 0; i < 1000; i++) {
        var foo1 = new Foo1();
    }

案例-2

    var Foo2 = function (name) {
        this.name = name;
    };

    Foo2.prototype = {
        getFirstName: function () { return "name1"; },
        getLastName: function () { return "name2"; },
    };

    for (var i = 0; i < 1000; i++) {
        var foo2 = new Foo2();
    }
  1. 哪种情况比使用内存更多?

  2. 我可以学习案例的内存使用情况吗?

  3. 案件的内存使用有何不同?

2 个答案:

答案 0 :(得分:2)

如果您定义functionobject属于prototype,那么它将由所有实例共享,并且使用new创建对象不会创建自己的实例功能/对象。在这个意义上,定义属于原型的东西使用更少的内存。确切的区别在于案例1(查看以下评论​​,因为您的定义不正确)将创建每个函数的1000个实例。案例2(再次查看下面的评论)将只创建每个函数的1个实例。

然而案例2没有在原型中定义。你基本上是在那里重新定义原型。正确的用法是:

function Foo2 (name) {
    this.name = name;
};

Foo2.prototype.getFirstName = function () { return "name1"; };
Foo2.prototype.getLastName = function () { return "name2"; };

您的案例1在您尝试实现的目标方面也未正确定义,因为getFirstNamegetLastName未通过this(实例)定义。

答案 1 :(得分:0)

第二种情况是内存效率更高,性能更高。在构造函数中定义方法时,将为每个对象分配相同的函数或方法,以便对象占用更多内存。因此,在prototype-object中定义方法,然后所有对象只共享相同的方法一次。

所以我的建议是你在构造函数中定义属性(数字,字符串......)以及在第二种情况下在原型对象中定义方法或函数。

当你以这种方式定义一个对象的时候:

var Foo1 = function (name) {
    this.name = name;
    getFirstName = function() { return "name1"; };
    getLastName = function() { return "name2"; };
};

方法getFirstName和getLastName是window的属性,因为你实际写了这个:

var Foo1 = function (name) {
    this.name = name;
    window.getFirstName = function() { return "name1"; };
    window.getLastName = function() { return "name2"; };
};