2013-06-11 4 views
3

Я хочу узнать о преимуществах использования прототипа JavaScript. Использование прототипа объекта увеличивает производительность. Я хочу увидеть это с помощью памяти.Производительность использования прототипа 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. В чем разница в использовании памяти в памяти?

+0

Этот вопрос имеет несколько дубликатов наверняка. Вы можете создавать свои собственные тесты здесь http://jsperf.com/ – elclanrs

+5

Производительность! == Использование памяти. –

+2

Ваш первый случай создаст глобальные функции, а не свойства объекта! – Sirko

ответ

2

Если определить function или object принадлежать к 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 (экземпляр).

0

Второй случай более эффективен с точки зрения памяти и производительности. Когда вы определяете методы в конструкторе, для каждого объекта выделяются одни и те же функции или методы, поэтому объект потребляет больше памяти. Поэтому определите методы в прототипе-объекте, тогда все объекты будут использовать одни и те же методы только один раз.

Так что я советую вам определить атрибуты (число, строку ...) в конструкторе и методы или функции в прототипе-объекте, как вы это делали во втором случае.

Кстати, когда вы определяете объект таким образом:

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

Метод getFirstName и getLastName являются свойства окна, потому что вы на самом деле написать это:

var Foo1 = function (name) { 
    this.name = name; 
    window.getFirstName = function() { return "name1"; }; 
    window.getLastName = function() { return "name2"; }; 
}; 
Смежные вопросы