3

我想了解使用 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. 案例的内存使用有什么区别?

4

2 回答 2

2

如果您定义 afunction或 anobject属于,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 也没有根据您要实现的目标正确定义,因为getFirstName并且getLastName不是通过this(实例)定义的。

于 2013-06-11T07:26:57.030 回答
0

第二种情况更节省内存和性能。当您在构造函数中定义方法时,会为每个对象分配相同的函数或方法,因此对象会消耗更多内存。所以在原型对象中定义方法,然后所有对象只共享一次相同的方法。

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

顺便说一句,当您以这种方式定义对象时:

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"; };
};
于 2013-06-11T08:00:25.430 回答