Эффективность памяти в объектах - PullRequest
0 голосов
/ 23 февраля 2011

Является ли один из этих шаблонов более или менее эффективным, чем другой?

Шаблон 1:

var jso = new Class({
   initialize: function () {
     // code
   },
   hiliteField: function () {
     // code
   }
});

Шаблон 2:

var jso = new Class({
   initialize: function () {
     this.hiliteField = hiliteField.bind(this);
     // code  
   }
});
var hiliteField = function () {
  // code
}

Ответы [ 2 ]

1 голос
/ 24 февраля 2011

Pattern 2 будет использовать больше памяти! Это основы прототип наследования

Почему? В шаблоне 1 каждый экземпляр jso будет ссылаться от jsoInstanceX.hiliteField до jso.prototype.hiliteField. Читайте: hiliteField не будет копией, она будет существовать только в jso.prototype.

В Pattern 2 вы создаете оболочку функции каждый раз, когда назначаете hiliteField.bind(this);. Дополнительная память невелика, но она также медленнее, особенно с учетом инициализации класса.

1 голос
/ 23 февраля 2011

Наличие нескольких методов, которые являются внешними по отношению к классу, и вверх по цепочке контекста, в отличие от класса, как методы 'namespaced', не может быть лучше, imo.

Не нравится шаблон № 2 по нескольким причинам:

  • управляемость - сделать привязку ссылки на каждую внешнюю функцию в классе будет сложно.
  • удобочитаемость - необходимость указать, какая функция используется каким классом будет задачей
  • расширяемость - поскольку функции находятся за пределами прототипа класса jso, классы, которые расширяют jso или используют его как миксин, не смогут получить доступ к внешним методам.

При этом с точки зрения памяти - просто проведите тест, но я бы сказал, что шаблон 1, вероятно, будет иметь меньшие накладные расходы, поскольку он определен один раз в прототипе, а не в каждом отдельном случае.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...