Есть ли преимущество в производительности памяти при назначении функции прототипу в JavaScript? - PullRequest
3 голосов
/ 24 августа 2010

Я прочитал, что добавление функций к объекту потребует больше памяти, чем добавление функций к прототипу объекта.

function Obj() {
    this.M = function() { // do something };
}

var o = new Obj();

Идея заключалась в том, что для каждой конструкции Obj создается новая функцияи применяется к Obj, тем самым увеличивая использование памяти.Для 1000 экземпляров Obj необходимо создать 1000 функций.

function Obj() {

}
Obj.prototype.M = function() { // do something };

var o = new Obj();

В этом случае для 1000 экземпляров Obj создается только одна функция.Чистая полная экономия памяти размером 999 * (M).

Это действительно так?Если это так, к какой категории относится следующая категория:

function Obj() {
    Obj.prototype.M = function() { // do something };
}
var o = new Obj();

Мои инстинкты говорят мне, что для каждой конструкции Obj в этом примере прототип будет назначаться каждый раз.Я не уверен, что думать об использовании памяти в этом случае, поскольку назначение той же функции прототипу просто заменило бы функцию вместо создания N ее копий для N экземпляров.

Я только начал использоватьэтот метод для инкапсуляции создания функций-членов, но хочу быть уверен, что я не делаю неправильных вещей.

Ответы [ 2 ]

2 голосов
/ 24 августа 2010
function Obj() {
    Obj.prototype.M = function() { // do something };
}
var o = new Obj();

Итак, как вы и предполагали, это создаст анонимную функцию и назначит ее прототипу во время создания нового объекта. Это просто бессмысленно, и немного медленнее ... если вы на самом деле не захватываете что-то вроде аргумента для конструктора в этом замыкании, в этом случае это также странно - потому что независимо от текущего M() случается так, что он все еще будет передаваться всем экземплярам Obj:

function Obj(name)
{
  Obj.prototype.M = function() { alert("Hello, " + name); }
}

var shog = new Obj("shog");
var josh = new Obj("josh");

shog.M(); // alerts, "Hello, josh"
josh.M(); // alerts, "Hello, josh"

Если вы придумали для этого хорошее применение, я хотел бы услышать это ...

Смотри также:

0 голосов
/ 24 августа 2010

В дополнение к тому, что уже было упомянуто.Вы увидите умеренную потерю производительности, если это замыкание имеет дескриптор локальной переменной (например, параметр конструктора).Мало того, что это было бы странно, как упоминалось в предыдущем постере, но это также предотвратит даже сборку мусора этой ссылочной переменной

...